evennia/docs/1.0-dev/_modules/evennia/utils/eveditor.html
Evennia docbuilder action f3dcfa1076 Updated HTML docs
2022-02-08 12:09:39 +00:00

1289 lines
No EOL
171 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.eveditor &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.eveditor</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.utils.eveditor</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">EvEditor (Evennia Line Editor)</span>
<span class="sd">This implements an advanced line editor for editing longer texts in-game. The</span>
<span class="sd">editor mimics the command mechanisms of the &quot;VI&quot; editor (a famous line-by-line</span>
<span class="sd">editor) as far as reasonable.</span>
<span class="sd">Features of the editor:</span>
<span class="sd">- undo/redo.</span>
<span class="sd">- edit/replace on any line of the buffer.</span>
<span class="sd">- search&amp;replace text anywhere in buffer.</span>
<span class="sd">- formatting of buffer, or selection, to certain width + indentations.</span>
<span class="sd">- allow to echo the input or not, depending on your client.</span>
<span class="sd">- in-built help</span>
<span class="sd">To use the editor, just import EvEditor from this module and initialize it:</span>
<span class="sd">```python</span>
<span class="sd">from evennia.utils.eveditor import EvEditor</span>
<span class="sd"># set up an editor to edit the caller&#39;s &#39;desc&#39; Attribute</span>
<span class="sd">def _loadfunc(caller):</span>
<span class="sd"> return caller.db.desc</span>
<span class="sd">def _savefunc(caller, buffer):</span>
<span class="sd"> caller.db.desc = buffer.strip()</span>
<span class="sd"> return True</span>
<span class="sd">def _quitfunc(caller):</span>
<span class="sd"> caller.msg(&quot;Custom quit message&quot;)</span>
<span class="sd"># start the editor</span>
<span class="sd">EvEditor(caller, loadfunc=None, savefunc=None, quitfunc=None, key=&quot;&quot;,</span>
<span class="sd"> persistent=True, code=False)</span>
<span class="sd">```</span>
<span class="sd">The editor can also be used to format Python code and be made to</span>
<span class="sd">survive a reload. See the `EvEditor` class for more details.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">CmdSet</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">is_iter</span><span class="p">,</span> <span class="n">fill</span><span class="p">,</span> <span class="n">dedent</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">justify</span><span class="p">,</span> <span class="n">to_str</span><span class="p">,</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="kn">import</span> <span class="n">raw</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="kn">import</span> <span class="n">cmdhandler</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="c1"># we use cmdhandler instead of evennia.syscmdkeys to</span>
<span class="c1"># avoid some cases of loading before evennia init&#39;d</span>
<span class="n">_CMD_NOMATCH</span> <span class="o">=</span> <span class="n">cmdhandler</span><span class="o">.</span><span class="n">CMD_NOMATCH</span>
<span class="n">_CMD_NOINPUT</span> <span class="o">=</span> <span class="n">cmdhandler</span><span class="o">.</span><span class="n">CMD_NOINPUT</span>
<span class="n">_RE_GROUP</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">.*?</span><span class="se">\&quot;</span><span class="s2">|\&#39;.*?\&#39;|\S*&quot;</span><span class="p">)</span>
<span class="n">_COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="c1"># use NAWS in the future?</span>
<span class="n">_DEFAULT_WIDTH</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># texts</span>
<span class="c1">#</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="n">_HELP_TEXT</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &lt;txt&gt; - any non-command is appended to the end of the buffer.</span>
<span class="sd"> : &lt;l&gt; - view buffer or only line(s) &lt;l&gt;</span>
<span class="sd"> :: &lt;l&gt; - raw-view buffer or only line(s) &lt;l&gt;</span>
<span class="sd"> ::: - escape - enter &#39;:&#39; as the only character on the line.</span>
<span class="sd"> :h - this help.</span>
<span class="sd"> :w - save the buffer (don&#39;t quit)</span>
<span class="sd"> :wq - save buffer and quit</span>
<span class="sd"> :q - quit (will be asked to save if buffer was changed)</span>
<span class="sd"> :q! - quit without saving, no questions asked</span>
<span class="sd"> :u - (undo) step backwards in undo history</span>
<span class="sd"> :uu - (redo) step forward in undo history</span>
<span class="sd"> :UU - reset all changes back to initial state</span>
<span class="sd"> :dd &lt;l&gt; - delete last line or line(s) &lt;l&gt;</span>
<span class="sd"> :dw &lt;l&gt; &lt;w&gt; - delete word or regex &lt;w&gt; in entire buffer or on line &lt;l&gt;</span>
<span class="sd"> :DD - clear entire buffer</span>
<span class="sd"> :y &lt;l&gt; - yank (copy) line(s) &lt;l&gt; to the copy buffer</span>
<span class="sd"> :x &lt;l&gt; - cut line(s) &lt;l&gt; and store it in the copy buffer</span>
<span class="sd"> :p &lt;l&gt; - put (paste) previously copied line(s) directly after &lt;l&gt;</span>
<span class="sd"> :i &lt;l&gt; &lt;txt&gt; - insert new text &lt;txt&gt; at line &lt;l&gt;. Old line will move down</span>
<span class="sd"> :r &lt;l&gt; &lt;txt&gt; - replace line &lt;l&gt; with text &lt;txt&gt;</span>
<span class="sd"> :I &lt;l&gt; &lt;txt&gt; - insert text at the beginning of line &lt;l&gt;</span>
<span class="sd"> :A &lt;l&gt; &lt;txt&gt; - append text after the end of line &lt;l&gt;</span>
<span class="sd"> :s &lt;l&gt; &lt;w&gt; &lt;txt&gt; - search/replace word or regex &lt;w&gt; in buffer or on line &lt;l&gt;</span>
<span class="sd"> :j &lt;l&gt; &lt;w&gt; - justify buffer or line &lt;l&gt;. &lt;w&gt; is f, c, l or r. Default f (full)</span>
<span class="sd"> :f &lt;l&gt; - flood-fill entire buffer or line &lt;l&gt;: Equivalent to :j left</span>
<span class="sd"> :fi &lt;l&gt; - indent entire buffer or line &lt;l&gt;</span>
<span class="sd"> :fd &lt;l&gt; - de-indent entire buffer or line &lt;l&gt;</span>
<span class="sd"> :echo - turn echoing of the input on/off (helpful for some clients)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_HELP_LEGEND</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Legend:</span>
<span class="sd"> &lt;l&gt; - line number, like &#39;5&#39; or range, like &#39;3:7&#39;.</span>
<span class="sd"> &lt;w&gt; - a single word, or multiple words with quotes around them.</span>
<span class="sd"> &lt;txt&gt; - longer string, usually not needing quotes.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_HELP_CODE</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :! - Execute code buffer without saving</span>
<span class="sd"> :&lt; - Decrease the level of automatic indentation for the next lines</span>
<span class="sd"> :&gt; - Increase the level of automatic indentation for the next lines</span>
<span class="sd"> := - Switch automatic indentation on/off</span>
<span class="sd">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">_ERROR_LOADFUNC</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">{error}</span>
<span class="sd">|rBuffer load function error. Could not load initial data.|n</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_ERROR_SAVEFUNC</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">{error}</span>
<span class="sd">|rSave function returned an error. Buffer not saved.|n</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_ERROR_NO_SAVEFUNC</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;|rNo save function defined. Buffer cannot be saved.|n&quot;</span><span class="p">)</span>
<span class="n">_MSG_SAVE_NO_CHANGE</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;No changes need saving&quot;</span><span class="p">)</span>
<span class="n">_DEFAULT_NO_QUITFUNC</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Exited editor.&quot;</span><span class="p">)</span>
<span class="n">_ERROR_QUITFUNC</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">{error}</span>
<span class="sd">|rQuit function gave an error. Skipping.|n</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_ERROR_PERSISTENT_SAVING</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">{error}</span>
<span class="sd">|rThe editor state could not be saved for persistent mode. Switching</span>
<span class="sd">to non-persistent mode (which means the editor session won&#39;t survive</span>
<span class="sd">an eventual server reload - so save often!)|n</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="n">_TRACE_PERSISTENT_SAVING</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;EvEditor persistent-mode error. Commonly, this is because one or &quot;</span>
<span class="s2">&quot;more of the EvEditor callbacks could not be pickled, for example &quot;</span>
<span class="s2">&quot;because it&#39;s a class method or is defined inside another function.&quot;</span>
<span class="p">)</span>
<span class="n">_MSG_NO_UNDO</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Nothing to undo.&quot;</span><span class="p">)</span>
<span class="n">_MSG_NO_REDO</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Nothing to redo.&quot;</span><span class="p">)</span>
<span class="n">_MSG_UNDO</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Undid one step.&quot;</span><span class="p">)</span>
<span class="n">_MSG_REDO</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Redid one step.&quot;</span><span class="p">)</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Handle yes/no quit question</span>
<span class="c1">#</span>
<span class="c1"># -------------------------------------------------------------</span>
<div class="viewcode-block" id="CmdSaveYesNo"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdSaveYesNo">[docs]</a><span class="k">class</span> <span class="nc">CmdSaveYesNo</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Save the editor state on quit. This catches</span>
<span class="sd"> nomatches (defaults to Yes), and avoid saves only if</span>
<span class="sd"> command was given specifically as &quot;no&quot; or &quot;n&quot;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">_CMD_NOMATCH</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">_CMD_NOINPUT</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:all()&quot;</span>
<span class="n">help_cateogory</span> <span class="o">=</span> <span class="s2">&quot;LineEditor&quot;</span>
<div class="viewcode-block" id="CmdSaveYesNo.func"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdSaveYesNo.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Implement the yes/no choice.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># this is only called from inside the lineeditor</span>
<span class="c1"># so caller.ndb._lineditor must be set.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">SaveYesNoCmdSet</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no&quot;</span><span class="p">,</span> <span class="s2">&quot;n&quot;</span><span class="p">):</span>
<span class="c1"># answered no</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span><span class="o">.</span><span class="n">quit</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># answered yes (default)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span><span class="o">.</span><span class="n">save_buffer</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="SaveYesNoCmdSet"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.SaveYesNoCmdSet">[docs]</a><span class="k">class</span> <span class="nc">SaveYesNoCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Stores the yesno question</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;quitsave_yesno&quot;</span>
<span class="n">priority</span> <span class="o">=</span> <span class="mi">150</span> <span class="c1"># override other cmdsets.</span>
<span class="n">mergetype</span> <span class="o">=</span> <span class="s2">&quot;Replace&quot;</span>
<div class="viewcode-block" id="SaveYesNoCmdSet.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.SaveYesNoCmdSet.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;at cmdset creation&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdSaveYesNo</span><span class="p">())</span></div></div>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Editor commands</span>
<span class="c1">#</span>
<span class="c1"># -------------------------------------------------------------</span>
<div class="viewcode-block" id="CmdEditorBase"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdEditorBase">[docs]</a><span class="k">class</span> <span class="nc">CmdEditorBase</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Base parent for editor commands</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:all()&quot;</span>
<span class="n">help_entry</span> <span class="o">=</span> <span class="s2">&quot;LineEditor&quot;</span>
<span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="CmdEditorBase.parse"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdEditorBase.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handles pre-parsing. Editor commands are on the form</span>
<span class="sd"> ::</span>
<span class="sd"> :cmd [li] [w] [txt]</span>
<span class="sd"> Where all arguments are optional.</span>
<span class="sd"> - `li` - line number (int), starting from 1. This could also</span>
<span class="sd"> be a range given as &lt;l&gt;:&lt;l&gt;.</span>
<span class="sd"> - `w` - word(s) (string), could be encased in quotes.</span>
<span class="sd"> - `txt` - extra text (string), could be encased in quotes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">editor</span><span class="p">:</span>
<span class="c1"># this will completely replace the editor</span>
<span class="n">_load_editor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">editor</span> <span class="o">=</span> <span class="n">editor</span>
<span class="n">linebuffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">get_buffer</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">nlines</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">)</span>
<span class="c1"># The regular expression will split the line by whitespaces,</span>
<span class="c1"># stripping extra whitespaces, except if the text is</span>
<span class="c1"># surrounded by single- or double quotes, in which case they</span>
<span class="c1"># will be kept together and extra whitespace preserved. You</span>
<span class="c1"># can input quotes on the line by alternating single and</span>
<span class="c1"># double quotes.</span>
<span class="n">arglist</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">_RE_GROUP</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="k">if</span> <span class="n">part</span><span class="p">]</span>
<span class="n">temp</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arglist</span><span class="p">:</span>
<span class="c1"># we want to clean the quotes, but only one type,</span>
<span class="c1"># in case we are nesting.</span>
<span class="k">if</span> <span class="n">arg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">):</span>
<span class="n">arg</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">arg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">):</span>
<span class="n">arg</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span>
<span class="n">temp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="n">arglist</span> <span class="o">=</span> <span class="n">temp</span>
<span class="c1"># A dumb split, without grouping quotes</span>
<span class="n">words</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="c1"># current line number</span>
<span class="n">cline</span> <span class="o">=</span> <span class="n">nlines</span> <span class="o">-</span> <span class="mi">1</span>
<span class="c1"># the first argument could also be a range of line numbers, on the</span>
<span class="c1"># form &lt;lstart&gt;:&lt;lend&gt;. Either of the ends could be missing, to</span>
<span class="c1"># mean start/end of buffer respectively.</span>
<span class="n">lstart</span><span class="p">,</span> <span class="n">lend</span> <span class="o">=</span> <span class="n">cline</span><span class="p">,</span> <span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">linerange</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">arglist</span> <span class="ow">and</span> <span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">part1</span><span class="p">,</span> <span class="n">part2</span> <span class="o">=</span> <span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">part1</span> <span class="ow">and</span> <span class="n">part1</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">part1</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">nlines</span><span class="p">)</span>
<span class="n">linerange</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">part2</span> <span class="ow">and</span> <span class="n">part2</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">lend</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">part2</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">linerange</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="n">arglist</span> <span class="ow">and</span> <span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">nlines</span><span class="p">)</span>
<span class="n">lend</span> <span class="o">=</span> <span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">linerange</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">linerange</span><span class="p">:</span>
<span class="n">arglist</span> <span class="o">=</span> <span class="n">arglist</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="c1"># nicer output formatting of the line range.</span>
<span class="n">lstr</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;line </span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">linerange</span> <span class="ow">or</span> <span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">lend</span>
<span class="k">else</span> <span class="s2">&quot;lines </span><span class="si">%i</span><span class="s2">-</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">lend</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># arg1 and arg2 is whatever arguments. Line numbers or -ranges are</span>
<span class="c1"># never included here.</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arglist</span><span class="p">)</span>
<span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">arglist</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span> <span class="o">=</span> <span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arglist</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">arg1</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arglist</span><span class="p">)</span>
<span class="c1"># store for use in func()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">linebuffer</span> <span class="o">=</span> <span class="n">linebuffer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nlines</span> <span class="o">=</span> <span class="n">nlines</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arglist</span> <span class="o">=</span> <span class="n">arglist</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">=</span> <span class="n">cline</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lstart</span> <span class="o">=</span> <span class="n">lstart</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lend</span> <span class="o">=</span> <span class="n">lend</span>
<span class="bp">self</span><span class="o">.</span><span class="n">linerange</span> <span class="o">=</span> <span class="n">linerange</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lstr</span> <span class="o">=</span> <span class="n">lstr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">words</span> <span class="o">=</span> <span class="n">words</span>
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arg1</span> <span class="o">=</span> <span class="n">arg1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arg2</span> <span class="o">=</span> <span class="n">arg2</span></div></div>
<span class="k">def</span> <span class="nf">_load_editor</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Load persistent editor from storage.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">saved_options</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;_eveditor_saved&quot;</span><span class="p">)</span>
<span class="n">saved_buffer</span><span class="p">,</span> <span class="n">saved_undo</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;_eveditor_buffer_temp&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">unsaved</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;_eveditor_unsaved&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">indent</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">saved_options</span><span class="p">:</span>
<span class="n">eveditor</span> <span class="o">=</span> <span class="n">EvEditor</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="o">**</span><span class="n">saved_options</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="n">saved_buffer</span><span class="p">:</span>
<span class="c1"># we have to re-save the buffer data so we can handle subsequent restarts</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_buffer_temp&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">saved_buffer</span><span class="p">,</span> <span class="n">saved_undo</span><span class="p">))</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="s2">&quot;_buffer&quot;</span><span class="p">,</span> <span class="n">saved_buffer</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="s2">&quot;_undo_buffer&quot;</span><span class="p">,</span> <span class="n">saved_undo</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="s2">&quot;_undo_pos&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">saved_undo</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="s2">&quot;_unsaved&quot;</span><span class="p">,</span> <span class="n">unsaved</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="s2">&quot;_indent&quot;</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">saved_options</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">eveditor</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># something went wrong. Cleanup.</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">EvEditorCmdSet</span><span class="p">)</span>
<div class="viewcode-block" id="CmdLineInput"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdLineInput">[docs]</a><span class="k">class</span> <span class="nc">CmdLineInput</span><span class="p">(</span><span class="n">CmdEditorBase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> No command match - Inputs line of text into buffer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">_CMD_NOMATCH</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">_CMD_NOINPUT</span>
<div class="viewcode-block" id="CmdLineInput.func"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdLineInput.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Adds the line without any formatting changes.</span>
<span class="sd"> If the editor handles code, it might add automatic</span>
<span class="sd"> indentation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">get_buffer</span><span class="p">()</span>
<span class="c1"># add a line of text to buffer</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span> <span class="ow">and</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># if automatic indentation is active, add spaces</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">deduce_indent</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">line</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">buf</span> <span class="k">else</span> <span class="n">buf</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">_echo_mode</span><span class="p">:</span>
<span class="c1"># need to do it here or we will be off one line</span>
<span class="n">cline</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">get_buffer</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="c1"># display the current level of identation</span>
<span class="n">indent</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span>
<span class="k">if</span> <span class="n">indent</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s2">&quot;off&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|b</span><span class="si">%02i</span><span class="s2">|||n (|g</span><span class="si">%s</span><span class="s2">|n) </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">cline</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">raw</span><span class="p">(</span><span class="n">line</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|b</span><span class="si">%02i</span><span class="s2">|||n </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">cline</span><span class="p">,</span> <span class="n">raw</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)))</span></div></div>
<div class="viewcode-block" id="CmdEditorGroup"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdEditorGroup">[docs]</a><span class="k">class</span> <span class="nc">CmdEditorGroup</span><span class="p">(</span><span class="n">CmdEditorBase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Commands for the editor</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;:editor_command_group&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;:&quot;</span><span class="p">,</span>
<span class="s2">&quot;::&quot;</span><span class="p">,</span>
<span class="s2">&quot;:::&quot;</span><span class="p">,</span>
<span class="s2">&quot;:h&quot;</span><span class="p">,</span>
<span class="s2">&quot;:w&quot;</span><span class="p">,</span>
<span class="s2">&quot;:wq&quot;</span><span class="p">,</span>
<span class="s2">&quot;:q&quot;</span><span class="p">,</span>
<span class="s2">&quot;:q!&quot;</span><span class="p">,</span>
<span class="s2">&quot;:u&quot;</span><span class="p">,</span>
<span class="s2">&quot;:uu&quot;</span><span class="p">,</span>
<span class="s2">&quot;:UU&quot;</span><span class="p">,</span>
<span class="s2">&quot;:dd&quot;</span><span class="p">,</span>
<span class="s2">&quot;:dw&quot;</span><span class="p">,</span>
<span class="s2">&quot;:DD&quot;</span><span class="p">,</span>
<span class="s2">&quot;:y&quot;</span><span class="p">,</span>
<span class="s2">&quot;:x&quot;</span><span class="p">,</span>
<span class="s2">&quot;:p&quot;</span><span class="p">,</span>
<span class="s2">&quot;:i&quot;</span><span class="p">,</span>
<span class="s2">&quot;:j&quot;</span><span class="p">,</span>
<span class="s2">&quot;:r&quot;</span><span class="p">,</span>
<span class="s2">&quot;:I&quot;</span><span class="p">,</span>
<span class="s2">&quot;:A&quot;</span><span class="p">,</span>
<span class="s2">&quot;:s&quot;</span><span class="p">,</span>
<span class="s2">&quot;:S&quot;</span><span class="p">,</span>
<span class="s2">&quot;:f&quot;</span><span class="p">,</span>
<span class="s2">&quot;:fi&quot;</span><span class="p">,</span>
<span class="s2">&quot;:fd&quot;</span><span class="p">,</span>
<span class="s2">&quot;:echo&quot;</span><span class="p">,</span>
<span class="s2">&quot;:!&quot;</span><span class="p">,</span>
<span class="s2">&quot;:&lt;&quot;</span><span class="p">,</span>
<span class="s2">&quot;:&gt;&quot;</span><span class="p">,</span>
<span class="s2">&quot;:=&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="n">arg_regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\s.*?|$&quot;</span>
<div class="viewcode-block" id="CmdEditorGroup.func"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.CmdEditorGroup.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This command handles all the in-editor :-style commands. Since</span>
<span class="sd"> each command is small and very limited, this makes for a more</span>
<span class="sd"> efficient presentation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span>
<span class="n">linebuffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">linebuffer</span>
<span class="n">lstart</span><span class="p">,</span> <span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lstart</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lend</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span>
<span class="n">echo_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">_echo_mode</span>
<span class="k">if</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:&quot;</span><span class="p">:</span>
<span class="c1"># Echo buffer</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">display_buffer</span><span class="p">(</span><span class="n">buf</span><span class="o">=</span><span class="n">buf</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="n">lstart</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">display_buffer</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;::&quot;</span><span class="p">:</span>
<span class="c1"># Echo buffer without the line numbers and syntax parsing</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">display_buffer</span><span class="p">(</span><span class="n">buf</span><span class="o">=</span><span class="n">buf</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="n">lstart</span><span class="p">,</span> <span class="n">linenums</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;raw&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">display_buffer</span><span class="p">(</span><span class="n">linenums</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;raw&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:::&quot;</span><span class="p">:</span>
<span class="c1"># Insert single colon alone on a line</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">([</span><span class="s2">&quot;:&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="n">lstart</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">linebuffer</span> <span class="o">+</span> <span class="p">[</span><span class="s2">&quot;:&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">echo_mode</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Single &#39;:&#39; added to buffer.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:h&quot;</span><span class="p">:</span>
<span class="c1"># help entry</span>
<span class="n">editor</span><span class="o">.</span><span class="n">display_help</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:w&quot;</span><span class="p">:</span>
<span class="c1"># save without quitting</span>
<span class="n">editor</span><span class="o">.</span><span class="n">save_buffer</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:wq&quot;</span><span class="p">:</span>
<span class="c1"># save and quit</span>
<span class="n">editor</span><span class="o">.</span><span class="n">save_buffer</span><span class="p">()</span>
<span class="n">editor</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:q&quot;</span><span class="p">:</span>
<span class="c1"># quit. If not saved, will ask</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">editor</span><span class="o">.</span><span class="n">_unsaved</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">SaveYesNoCmdSet</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Save before quitting?&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; |lcyes|lt[Y]|le/|lcno|ltN|le&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:q!&quot;</span><span class="p">:</span>
<span class="c1"># force quit, not checking saving</span>
<span class="n">editor</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:u&quot;</span><span class="p">:</span>
<span class="c1"># undo</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_undo</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:uu&quot;</span><span class="p">:</span>
<span class="c1"># redo</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_undo</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:UU&quot;</span><span class="p">:</span>
<span class="c1"># reset buffer</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">editor</span><span class="o">.</span><span class="n">_pristine_buffer</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Reverted all changes to the buffer back to original state.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:dd&quot;</span><span class="p">:</span>
<span class="c1"># :dd &lt;l&gt; - delete line &lt;l&gt;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Deleted </span><span class="si">{string}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:dw&quot;</span><span class="p">:</span>
<span class="c1"># :dw &lt;w&gt; - delete word in entire buffer</span>
<span class="c1"># :dw &lt;l&gt; &lt;w&gt; delete word only on line(s) &lt;l&gt;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You must give a search word to delete.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Removed </span><span class="si">{arg1}</span><span class="s2"> for lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">arg1</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="p">,</span> <span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span> <span class="o">+</span> <span class="mi">1</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Removed </span><span class="si">{arg1}</span><span class="s2"> for </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">arg1</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">sarea</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">])</span>
<span class="n">sarea</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">sarea</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">sarea</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:DD&quot;</span><span class="p">:</span>
<span class="c1"># clear buffer</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># Reset indentation level to 0</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Cleared </span><span class="si">{nlines}</span><span class="s2"> lines from buffer.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">nlines</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">nlines</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:y&quot;</span><span class="p">:</span>
<span class="c1"># :y &lt;l&gt; - yank line(s) to copy buffer</span>
<span class="n">cbuf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">_copy_buffer</span> <span class="o">=</span> <span class="n">cbuf</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{line}</span><span class="s2">, </span><span class="si">{cbuf}</span><span class="s2"> yanked.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="o">.</span><span class="n">capitalize</span><span class="p">(),</span> <span class="n">cbuf</span><span class="o">=</span><span class="n">cbuf</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:x&quot;</span><span class="p">:</span>
<span class="c1"># :x &lt;l&gt; - cut line to copy buffer</span>
<span class="n">cbuf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">_copy_buffer</span> <span class="o">=</span> <span class="n">cbuf</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{line}</span><span class="s2">, </span><span class="si">{cbuf}</span><span class="s2"> cut.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="o">.</span><span class="n">capitalize</span><span class="p">(),</span> <span class="n">cbuf</span><span class="o">=</span><span class="n">cbuf</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:p&quot;</span><span class="p">:</span>
<span class="c1"># :p &lt;l&gt; paste line(s) from copy buffer</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">editor</span><span class="o">.</span><span class="n">_copy_buffer</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Copy buffer is empty.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">editor</span><span class="o">.</span><span class="n">_copy_buffer</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Pasted buffer </span><span class="si">{cbuf}</span><span class="s2"> to </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">cbuf</span><span class="o">=</span><span class="n">editor</span><span class="o">.</span><span class="n">_copy_buffer</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:i&quot;</span><span class="p">:</span>
<span class="c1"># :i &lt;l&gt; &lt;txt&gt; - insert new line</span>
<span class="n">new_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_lines</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You need to enter a new line and where to insert it.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">new_lines</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Inserted </span><span class="si">{num}</span><span class="s2"> new line(s) at </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">num</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">new_lines</span><span class="p">),</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:r&quot;</span><span class="p">:</span>
<span class="c1"># :r &lt;l&gt; &lt;txt&gt; - replace lines</span>
<span class="n">new_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_lines</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You need to enter a replacement string.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">new_lines</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Replaced </span><span class="si">{num}</span><span class="s2"> line(s) at </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">num</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">new_lines</span><span class="p">),</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:I&quot;</span><span class="p">:</span>
<span class="c1"># :I &lt;l&gt; &lt;txt&gt; - insert text at beginning of line(s) &lt;l&gt;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You need to enter text to insert.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]]</span>
<span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="p">)</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Inserted text at beginning of </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:A&quot;</span><span class="p">:</span>
<span class="c1"># :A &lt;l&gt; &lt;txt&gt; - append text after end of line(s)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You need to enter text to append.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]]</span>
<span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="p">)</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Appended text to end of </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:s&quot;</span><span class="p">:</span>
<span class="c1"># :s &lt;li&gt; &lt;w&gt; &lt;txt&gt; - search and replace words</span>
<span class="c1"># in entire buffer or on certain lines</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg2</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You must give a search word and something to replace it with.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Search-replaced </span><span class="si">{arg1}</span><span class="s2"> -&gt; </span><span class="si">{arg2}</span><span class="s2"> for lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">arg1</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg2</span><span class="p">,</span> <span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Search-replaced </span><span class="si">{arg1}</span><span class="s2"> -&gt; </span><span class="si">{arg2}</span><span class="s2"> for </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">arg1</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">arg2</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">sarea</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">])</span>
<span class="n">regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">|^</span><span class="si">%s</span><span class="s2">(?=\s)|(?&lt;=\s)</span><span class="si">%s</span><span class="s2">(?=\s)|^</span><span class="si">%s</span><span class="s2">$|(?&lt;=\s)</span><span class="si">%s</span><span class="s2">$&quot;</span>
<span class="n">regarg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot; &quot;</span> <span class="ow">in</span> <span class="n">regarg</span><span class="p">:</span>
<span class="n">regarg</span> <span class="o">=</span> <span class="n">regarg</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot; +&quot;</span><span class="p">)</span>
<span class="n">sarea</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span>
<span class="n">regex</span> <span class="o">%</span> <span class="p">(</span><span class="n">regarg</span><span class="p">,</span> <span class="n">regarg</span><span class="p">,</span> <span class="n">regarg</span><span class="p">,</span> <span class="n">regarg</span><span class="p">,</span> <span class="n">regarg</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arg2</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">),</span>
<span class="n">sarea</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">sarea</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:f&quot;</span><span class="p">:</span>
<span class="c1"># :f &lt;l&gt; flood-fill buffer or &lt;l&gt; lines of buffer.</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">_DEFAULT_WIDTH</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Flood filled lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Flood filled </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="n">fbuf</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">])</span>
<span class="n">fbuf</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">fbuf</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">fbuf</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:j&quot;</span><span class="p">:</span>
<span class="c1"># :f &lt;l&gt; &lt;w&gt; justify buffer of &lt;l&gt; with &lt;w&gt; as align (one of</span>
<span class="c1"># f(ull), c(enter), r(ight) or l(left). Default is full.</span>
<span class="n">align_map</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;full&quot;</span><span class="p">:</span> <span class="s2">&quot;f&quot;</span><span class="p">,</span>
<span class="s2">&quot;f&quot;</span><span class="p">:</span> <span class="s2">&quot;f&quot;</span><span class="p">,</span>
<span class="s2">&quot;center&quot;</span><span class="p">:</span> <span class="s2">&quot;c&quot;</span><span class="p">,</span>
<span class="s2">&quot;c&quot;</span><span class="p">:</span> <span class="s2">&quot;c&quot;</span><span class="p">,</span>
<span class="s2">&quot;right&quot;</span><span class="p">:</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span>
<span class="s2">&quot;r&quot;</span><span class="p">:</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span>
<span class="s2">&quot;left&quot;</span><span class="p">:</span> <span class="s2">&quot;l&quot;</span><span class="p">,</span>
<span class="s2">&quot;l&quot;</span><span class="p">:</span> <span class="s2">&quot;l&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">align_name</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;f&quot;</span><span class="p">:</span> <span class="s2">&quot;Full&quot;</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span><span class="p">:</span> <span class="s2">&quot;Center&quot;</span><span class="p">,</span> <span class="s2">&quot;l&quot;</span><span class="p">:</span> <span class="s2">&quot;Left&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">:</span> <span class="s2">&quot;Right&quot;</span><span class="p">}</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">_DEFAULT_WIDTH</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">align_map</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Valid justifications are&quot;</span><span class="p">)</span>
<span class="o">+</span> <span class="s2">&quot; [f]ull (default), [c]enter, [r]right or [l]eft&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="n">align</span> <span class="o">=</span> <span class="n">align_map</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">arg1</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg1</span> <span class="k">else</span> <span class="s2">&quot;f&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{align}</span><span class="s2">-justified lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">align</span><span class="o">=</span><span class="n">align_name</span><span class="p">[</span><span class="n">align</span><span class="p">],</span> <span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{align}</span><span class="s2">-justified </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">align</span><span class="o">=</span><span class="n">align_name</span><span class="p">[</span><span class="n">align</span><span class="p">],</span> <span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">jbuf</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">])</span>
<span class="n">jbuf</span> <span class="o">=</span> <span class="n">justify</span><span class="p">(</span><span class="n">jbuf</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="n">align</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">jbuf</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:fi&quot;</span><span class="p">:</span>
<span class="c1"># :fi &lt;l&gt; indent buffer or lines &lt;l&gt; of buffer.</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">4</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Indented lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Indented </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="n">fbuf</span> <span class="o">=</span> <span class="p">[</span><span class="n">indent</span> <span class="o">+</span> <span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">]]</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">fbuf</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:fd&quot;</span><span class="p">:</span>
<span class="c1"># :fi &lt;l&gt; indent buffer or lines &lt;l&gt; of buffer.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">linerange</span><span class="p">:</span>
<span class="n">lstart</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cline</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Removed left margin (dedented) lines </span><span class="si">{l1}</span><span class="s2">-</span><span class="si">{l2}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">l1</span><span class="o">=</span><span class="n">lstart</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l2</span><span class="o">=</span><span class="n">lend</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Removed left margin (dedented) </span><span class="si">{line}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lstr</span><span class="p">))</span>
<span class="n">fbuf</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">linebuffer</span><span class="p">[</span><span class="n">lstart</span><span class="p">:</span><span class="n">lend</span><span class="p">])</span>
<span class="n">fbuf</span> <span class="o">=</span> <span class="n">dedent</span><span class="p">(</span><span class="n">fbuf</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">linebuffer</span><span class="p">[:</span><span class="n">lstart</span><span class="p">]</span> <span class="o">+</span> <span class="n">fbuf</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">linebuffer</span><span class="p">[</span><span class="n">lend</span><span class="p">:]</span>
<span class="n">editor</span><span class="o">.</span><span class="n">update_buffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:echo&quot;</span><span class="p">:</span>
<span class="c1"># set echoing on/off</span>
<span class="n">editor</span><span class="o">.</span><span class="n">_echo_mode</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">editor</span><span class="o">.</span><span class="n">_echo_mode</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Echo mode set to </span><span class="si">{mode}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="n">editor</span><span class="o">.</span><span class="n">_echo_mode</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:!&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">editor</span><span class="o">.</span><span class="n">_buffer</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;This command is only available in code editor mode.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:&lt;&quot;</span><span class="p">:</span>
<span class="c1"># :&lt;</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">decrease_indent</span><span class="p">()</span>
<span class="n">indent</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span>
<span class="k">if</span> <span class="n">indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Decreased indentation: new indentation is </span><span class="si">{indent}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">indent</span><span class="o">=</span><span class="n">indent</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;|rManual indentation is OFF.|n Use := to turn it on.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;This command is only available in code editor mode.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:&gt;&quot;</span><span class="p">:</span>
<span class="c1"># :&gt;</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">increase_indent</span><span class="p">()</span>
<span class="n">indent</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span>
<span class="k">if</span> <span class="n">indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Increased indentation: new indentation is </span><span class="si">{indent}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">indent</span><span class="o">=</span><span class="n">indent</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;|rManual indentation is OFF.|n Use := to turn it on.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;This command is only available in code editor mode.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="o">==</span> <span class="s2">&quot;:=&quot;</span><span class="p">:</span>
<span class="c1"># :=</span>
<span class="k">if</span> <span class="n">editor</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">editor</span><span class="o">.</span><span class="n">swap_autoindent</span><span class="p">()</span>
<span class="n">indent</span> <span class="o">=</span> <span class="n">editor</span><span class="o">.</span><span class="n">_indent</span>
<span class="k">if</span> <span class="n">indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Auto-indentation turned on.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Auto-indentation turned off.&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;This command is only available in code editor mode.&quot;</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="EvEditorCmdSet"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditorCmdSet">[docs]</a><span class="k">class</span> <span class="nc">EvEditorCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;CmdSet for the editor commands&quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;editorcmdset&quot;</span>
<span class="n">mergetype</span> <span class="o">=</span> <span class="s2">&quot;Replace&quot;</span>
<div class="viewcode-block" id="EvEditorCmdSet.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditorCmdSet.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdLineInput</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdEditorGroup</span><span class="p">())</span></div></div>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Main Editor object</span>
<span class="c1">#</span>
<span class="c1"># -------------------------------------------------------------</span>
<div class="viewcode-block" id="EvEditor"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor">[docs]</a><span class="k">class</span> <span class="nc">EvEditor</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This defines a line editor object. It creates all relevant commands</span>
<span class="sd"> and tracks the current state of the buffer. It also cleans up after</span>
<span class="sd"> itself.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="EvEditor.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">caller</span><span class="p">,</span>
<span class="n">loadfunc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">savefunc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">quitfunc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">key</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">codefunc</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Launches a full in-game line editor, mimicking the functionality of VIM.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object): Who is using the editor.</span>
<span class="sd"> loadfunc (callable, optional): This will be called as</span>
<span class="sd"> `loadfunc(caller)` when the editor is first started. Its</span>
<span class="sd"> return will be used as the editor&#39;s starting buffer.</span>
<span class="sd"> savefunc (callable, optional): This will be called as</span>
<span class="sd"> `savefunc(caller, buffer)` when the save-command is given and</span>
<span class="sd"> is used to actually determine where/how result is saved.</span>
<span class="sd"> It should return `True` if save was successful and also</span>
<span class="sd"> handle any feedback to the user.</span>
<span class="sd"> quitfunc (callable, optional): This will optionally be</span>
<span class="sd"> called as `quitfunc(caller)` when the editor is</span>
<span class="sd"> exited. If defined, it should handle all wanted feedback</span>
<span class="sd"> to the user.</span>
<span class="sd"> quitfunc_args (tuple, optional): Optional tuple of arguments to</span>
<span class="sd"> supply to `quitfunc`.</span>
<span class="sd"> key (str, optional): An optional key for naming this</span>
<span class="sd"> session and make it unique from other editing sessions.</span>
<span class="sd"> persistent (bool, optional): Make the editor survive a reboot. Note</span>
<span class="sd"> that if this is set, all callables must be possible to pickle</span>
<span class="sd"> codefunc (bool, optional): If given, will run the editor in code mode.</span>
<span class="sd"> This will be called as `codefunc(caller, buf)`.</span>
<span class="sd"> Notes:</span>
<span class="sd"> In persistent mode, all the input callables (savefunc etc)</span>
<span class="sd"> must be possible to be *pickled*, this excludes e.g.</span>
<span class="sd"> callables that are class methods or functions defined</span>
<span class="sd"> dynamically or as part of another function. In</span>
<span class="sd"> non-persistent mode no such restrictions exist.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_key</span> <span class="o">=</span> <span class="n">key</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span> <span class="o">=</span> <span class="n">caller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_eveditor</span> <span class="o">=</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_unsaved</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span> <span class="o">=</span> <span class="n">persistent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">loadfunc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loadfunc</span> <span class="o">=</span> <span class="n">loadfunc</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_loadfunc</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">caller</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">load_buffer</span><span class="p">()</span>
<span class="k">if</span> <span class="n">savefunc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_savefunc</span> <span class="o">=</span> <span class="n">savefunc</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_savefunc</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">caller</span><span class="p">,</span> <span class="n">buffer</span><span class="p">:</span> <span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_ERROR_NO_SAVEFUNC</span><span class="p">)</span>
<span class="k">if</span> <span class="n">quitfunc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_quitfunc</span> <span class="o">=</span> <span class="n">quitfunc</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_quitfunc</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">caller</span><span class="p">:</span> <span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_DEFAULT_NO_QUITFUNC</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span> <span class="o">=</span> <span class="n">codefunc</span>
<span class="c1"># store the original version</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pristine_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sep</span> <span class="o">=</span> <span class="s2">&quot;-&quot;</span>
<span class="c1"># undo operation buffer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_max</span> <span class="o">=</span> <span class="mi">20</span>
<span class="c1"># copy buffer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_copy_buffer</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">persistent</span><span class="p">:</span>
<span class="c1"># save in tuple {kwargs, other options}</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="s2">&quot;_eveditor_saved&quot;</span><span class="p">,</span>
<span class="p">(</span>
<span class="nb">dict</span><span class="p">(</span>
<span class="n">loadfunc</span><span class="o">=</span><span class="n">loadfunc</span><span class="p">,</span>
<span class="n">savefunc</span><span class="o">=</span><span class="n">savefunc</span><span class="p">,</span>
<span class="n">quitfunc</span><span class="o">=</span><span class="n">quitfunc</span><span class="p">,</span>
<span class="n">codefunc</span><span class="o">=</span><span class="n">codefunc</span><span class="p">,</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="n">persistent</span><span class="p">,</span>
<span class="p">),</span>
<span class="nb">dict</span><span class="p">(</span><span class="n">_pristine_buffer</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pristine_buffer</span><span class="p">,</span> <span class="n">_sep</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_sep</span><span class="p">),</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_buffer_temp&quot;</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">))</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_unsaved&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_ERROR_PERSISTENT_SAVING</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="n">err</span><span class="p">))</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="n">_TRACE_PERSISTENT_SAVING</span><span class="p">)</span>
<span class="n">persistent</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># Create the commands we need</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">EvEditorCmdSet</span><span class="p">,</span> <span class="n">persistent</span><span class="o">=</span><span class="n">persistent</span><span class="p">)</span>
<span class="c1"># echo inserted text back to caller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_echo_mode</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># show the buffer ui</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display_buffer</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvEditor.load_buffer"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.load_buffer">[docs]</a> <span class="k">def</span> <span class="nf">load_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Load the buffer using the load function hook.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_loadfunc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;|rBuffer is of type |w</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">)</span><span class="si">}</span><span class="s2">)|r. &quot;</span>
<span class="s2">&quot;Continuing, it is converted to a string &quot;</span>
<span class="s2">&quot;(and will be saved as such)!|n&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="n">to_str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_ERROR_LOADFUNC</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="n">e</span><span class="p">))</span></div>
<div class="viewcode-block" id="EvEditor.get_buffer"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.get_buffer">[docs]</a> <span class="k">def</span> <span class="nf">get_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return:</span>
<span class="sd"> buffer (str): The current buffer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span></div>
<div class="viewcode-block" id="EvEditor.update_buffer"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.update_buffer">[docs]</a> <span class="k">def</span> <span class="nf">update_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buf</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This should be called when the buffer has been changed</span>
<span class="sd"> somehow. It will handle unsaved flag and undo updating.</span>
<span class="sd"> Args:</span>
<span class="sd"> buf (str): The text to update the buffer with.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">buf</span><span class="p">):</span>
<span class="n">buf</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="k">if</span> <span class="n">buf</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="n">buf</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_undo</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_unsaved</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="s2">&quot;_eveditor_buffer_temp&quot;</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_unsaved&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.quit"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.quit">[docs]</a> <span class="k">def</span> <span class="nf">quit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Cleanly exit the editor.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_quitfunc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_ERROR_QUITFUNC</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="n">e</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">nattributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;_eveditor&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;_eveditor_buffer_temp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;_eveditor_saved&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;_eveditor_unsaved&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">EvEditorCmdSet</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.save_buffer"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.save_buffer">[docs]</a> <span class="k">def</span> <span class="nf">save_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Saves the content of the buffer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unsaved</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="c1"># always save code - this allows us to tie execution to</span>
<span class="c1"># saving if we want.</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_savefunc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">):</span>
<span class="c1"># Save codes should return a true value to indicate</span>
<span class="c1"># save worked. The saving function is responsible for</span>
<span class="c1"># any status messages.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_unsaved</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_ERROR_SAVEFUNC</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="n">e</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_MSG_SAVE_NO_CHANGE</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.update_undo"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.update_undo">[docs]</a> <span class="k">def</span> <span class="nf">update_undo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This updates the undo position.</span>
<span class="sd"> Args:</span>
<span class="sd"> step (int, optional): The amount of steps</span>
<span class="sd"> to progress the undo position to. This</span>
<span class="sd"> may be a negative value for undo and</span>
<span class="sd"> a positive value for redo.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">step</span> <span class="ow">and</span> <span class="n">step</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># undo</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_MSG_NO_UNDO</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">+</span> <span class="n">step</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_MSG_UNDO</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">step</span> <span class="ow">and</span> <span class="n">step</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># redo</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_max</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_MSG_NO_REDO</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">+</span> <span class="n">step</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_max</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_MSG_REDO</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span> <span class="ow">or</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span><span class="p">]</span>
<span class="p">):</span>
<span class="c1"># save undo state</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">[:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_undo_pos</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_undo_buffer</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span></div>
<div class="viewcode-block" id="EvEditor.display_buffer"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.display_buffer">[docs]</a> <span class="k">def</span> <span class="nf">display_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">linenums</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;raw&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">}):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This displays the line editor buffer, or selected parts of it.</span>
<span class="sd"> Args:</span>
<span class="sd"> buf (str, optional): The buffer or part of buffer to display.</span>
<span class="sd"> offset (int, optional): If `buf` is set and is not the full buffer,</span>
<span class="sd"> `offset` should define the actual starting line number, to</span>
<span class="sd"> get the linenum display right.</span>
<span class="sd"> linenums (bool, optional): Show line numbers in buffer.</span>
<span class="sd"> options: raw (bool, optional): Tell protocol to not parse</span>
<span class="sd"> formatting information.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">buf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer</span>
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">buf</span><span class="p">):</span>
<span class="n">buf</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">nlines</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="n">nwords</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
<span class="n">nchars</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">sep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sep</span>
<span class="n">header</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;|n&quot;</span>
<span class="o">+</span> <span class="n">sep</span> <span class="o">*</span> <span class="mi">10</span>
<span class="o">+</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Line Editor [</span><span class="si">{name}</span><span class="s2">]&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_key</span><span class="p">)</span>
<span class="o">+</span> <span class="n">sep</span> <span class="o">*</span> <span class="p">(</span><span class="n">_DEFAULT_WIDTH</span> <span class="o">-</span> <span class="mi">24</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_key</span><span class="p">))</span>
<span class="p">)</span>
<span class="n">footer</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;|n&quot;</span>
<span class="o">+</span> <span class="n">sep</span> <span class="o">*</span> <span class="mi">10</span>
<span class="o">+</span> <span class="s2">&quot;[l:</span><span class="si">%02i</span><span class="s2"> w:</span><span class="si">%03i</span><span class="s2"> c:</span><span class="si">%04i</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nlines</span><span class="p">,</span> <span class="n">nwords</span><span class="p">,</span> <span class="n">nchars</span><span class="p">)</span>
<span class="o">+</span> <span class="n">sep</span> <span class="o">*</span> <span class="mi">12</span>
<span class="o">+</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;(:h for help)&quot;</span><span class="p">)</span>
<span class="o">+</span> <span class="n">sep</span> <span class="o">*</span> <span class="p">(</span><span class="n">_DEFAULT_WIDTH</span> <span class="o">-</span> <span class="mi">54</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">linenums</span><span class="p">:</span>
<span class="n">main</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="s2">&quot;|b</span><span class="si">%02i</span><span class="s2">|||n </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">iline</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">offset</span><span class="p">,</span> <span class="n">raw</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="k">for</span> <span class="n">iline</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">main</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">raw</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">])</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">main</span><span class="p">,</span> <span class="n">footer</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="n">options</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.display_help"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.display_help">[docs]</a> <span class="k">def</span> <span class="nf">display_help</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Shows the help entry for the editor.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sep</span> <span class="o">*</span> <span class="n">_DEFAULT_WIDTH</span> <span class="o">+</span> <span class="n">_HELP_TEXT</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">_HELP_CODE</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">_HELP_LEGEND</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sep</span> <span class="o">*</span> <span class="n">_DEFAULT_WIDTH</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.deduce_indent"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.deduce_indent">[docs]</a> <span class="k">def</span> <span class="nf">deduce_indent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">buffer</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Try to deduce the level of indentation of the given line.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">keywords</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;elif &quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;if &quot;</span><span class="p">],</span>
<span class="s2">&quot;else:&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;if &quot;</span><span class="p">,</span> <span class="s2">&quot;try&quot;</span><span class="p">],</span>
<span class="s2">&quot;except&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;try:&quot;</span><span class="p">],</span>
<span class="s2">&quot;finally:&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;try:&quot;</span><span class="p">],</span>
<span class="p">}</span>
<span class="n">opening_tags</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;if &quot;</span><span class="p">,</span> <span class="s2">&quot;try:&quot;</span><span class="p">,</span> <span class="s2">&quot;for &quot;</span><span class="p">,</span> <span class="s2">&quot;while &quot;</span><span class="p">)</span>
<span class="c1"># If the line begins by one of the given keywords</span>
<span class="n">indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span> <span class="k">for</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">keywords</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="c1"># Get the keyword and matching begin tags</span>
<span class="n">keyword</span> <span class="o">=</span> <span class="p">[</span><span class="n">kw</span> <span class="k">for</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">keywords</span> <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">kw</span><span class="p">)][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">begin_tags</span> <span class="o">=</span> <span class="n">keywords</span><span class="p">[</span><span class="n">keyword</span><span class="p">]</span>
<span class="k">for</span> <span class="n">oline</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">buffer</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()):</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">oline</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">begin_tags</span><span class="p">):</span>
<span class="c1"># This line begins with a begin tag, takes the identation</span>
<span class="n">indent</span> <span class="o">=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">oline</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">oline</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)))</span> <span class="o">/</span> <span class="mi">4</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">any</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span> <span class="k">for</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">opening_tags</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span>
<span class="n">line</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">indent</span> <span class="o">+</span> <span class="n">line</span>
<span class="k">return</span> <span class="n">line</span></div>
<div class="viewcode-block" id="EvEditor.decrease_indent"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.decrease_indent">[docs]</a> <span class="k">def</span> <span class="nf">decrease_indent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Decrease automatic indentation by 1 level.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.increase_indent"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.increase_indent">[docs]</a> <span class="k">def</span> <span class="nf">increase_indent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Increase automatic indentation by 1 level.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvEditor.swap_autoindent"><a class="viewcode-back" href="../../../api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.swap_autoindent">[docs]</a> <span class="k">def</span> <span class="nf">swap_autoindent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Swap automatic indentation on or off.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_codefunc</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_persistent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;_eveditor_indent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="eveditor.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.eveditor</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>