prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Fix documentation on website
  Not sure if this belongs here, but I believe to have found a small issue on the website.
  
  Paragraph # 7 in [10 Ways to Use VisiData](https://www.visidata.org/blog/2020/ten/) says you should use `visidata.view_pandas(df)` to view a dataframe in pandas.
  
  I believe that should be `visidata.vd.view_pandas(df)`
  
  ![image](https://user-images.githubusercontent.com/14904570/158566552-df4f22c0-cb08-476c-a2d9-076577ebad5c.png)
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `visidata/vdobj.py`
  Content:
  ```
  1 from functools import wraps
  2 from unittest import mock
  3 import curses
  4 
  5 import visidata
  6 
  7 __all__ = ['ENTER', 'ALT', 'ESC', 'asyncthread', 'VisiData']
  8 
  9 
  10 ENTER='Enter'
  11 ALT=ESC='^['
  12 
  13 
  14 # define @asyncthread for potentially long-running functions
  15 #   when function is called, instead launches a thread
  16 def asyncthread(func):
  17     'Function decorator, to make calls to `func()` spawn a separate thread if available.'
  18     @wraps(func)
  19     def _execAsync(*args, **kwargs):
  20         if args and isinstance(args[0], visidata.BaseSheet):  #1136: allow cancel of async methods on Sheet
  21             if 'sheet' not in kwargs:
  22                 kwargs['sheet'] = args[0]
  23         return visidata.vd.execAsync(func, *args, **kwargs)
  24     return _execAsync
  25 
  26 
  27 class VisiData(visidata.Extensible):
  28     allPrefixes = ['g', 'z', ESC]  # embig'g'en, 'z'mallify, ESC=Alt/Meta
  29 
  30     @classmethod
  31     def global_api(cls, func):
  32         'Make global func() and identical vd.func()'
  33         def _vdfunc(*args, **kwargs):
  34             return func(visidata.vd, *args, **kwargs)
  35         setattr(cls, func.__name__, func)
  36         return wraps(func)(_vdfunc)
  37 
  38     def __init__(self):
  39         self.sheets = []  # list of BaseSheet; all sheets on the sheet stack
  40         self.allSheets = []  # list of all non-precious sheets ever pushed
  41         self.lastErrors = []
  42         self.keystrokes = ''
  43         self.scrFull = mock.MagicMock(__bool__=mock.Mock(return_value=False))  # disable curses in batch mode
  44         self._cmdlog = None
  45         self.contexts = [self]  # objects whose attributes are in the fallback context for eval/exec.
  46 
  47     def sheetstack(self, pane=0):
  48         'Return list of sheets in given *pane*. pane=0 is the active pane.  pane=-1 is the inactive pane.'
  49         if pane == -1:
  50             return list(vs for vs in self.sheets if vs.pane and (vs.pane != self.activePane))
  51         else:
  52             return list(vs for vs in self.sheets if vs.pane == (pane or self.activePane))
  53 
  54     @property
  55     def stackedSheets(self):
  56         return list(vs for vs in self.sheets if vs.pane)
  57 
  58     @property
  59     def activeSheet(self):
  60         'Return top sheet on sheets stack, or cmdlog if no sheets.'
  61         for vs in self.sheets:
  62             if vs.pane and vs.pane == self.activePane:
  63                 return vs
  64 
  65         for vs in self.sheets:
  66             if vs.pane and vs.pane != self.activePane:
  67                 return vs
  68 
  69         return self._cmdlog
  70 
  71     @property
  72     def activeStack(self):
  73         return self.sheetstack() or self.sheetstack(-1)
  74 
  75     @visidata.drawcache_property
  76     def mousereg(self):
  77         return []
  78 
  79     def __copy__(self):
  80         'Dummy method for Extensible.init()'
  81         pass
  82 
  83     def finalInit(self):
  84         'Initialize members specified in other modules with init()'
  85         pass
  86 
  87     @classmethod
  88     def init(cls, membername, initfunc, **kwargs):
  89         'Overload Extensible.init() to call finalInit instead of __init__'
  90         oldinit = cls.finalInit
  91         def newinit(self, *args, **kwargs):
  92             oldinit(self, *args, **kwargs)
  93             setattr(self, membername, initfunc())
  94         cls.finalInit = newinit
  95         super().init(membername, lambda: None, **kwargs)
  96 
  97     def clearCaches(self):
  98         'Invalidate internal caches between command inputs.'
  99         visidata.Extensible.clear_all_caches()
  100 
  101     def getkeystroke(self, scr, vs=None):
  102         'Get keystroke and display it on status bar.'
  103         k = None
  104         try:
  105             scr.refresh()
  106             k = scr.get_wch()
  107             vs = vs or self.activeSheet
  108             if vs:
  109                 self.drawRightStatus(vs._scr, vs) # continue to display progress %
  110         except curses.error:
  111             return ''  # curses timeout
  112 
  113         if isinstance(k, str):
  114             if ord(k) >= 32 and ord(k) != 127:  # 127 == DEL or ^?
  115                 return k
  116             k = ord(k)
  117         return curses.keyname(k).decode('utf-8')
  118 
  119     def onMouse(self, scr, y, x, h, w, **kwargs):
  120         self.mousereg.append((scr, y, x, h, w, kwargs))
  121 
  122     def getMouse(self, _scr, _x, _y, button):
  123         for scr, y, x, h, w, kwargs in self.mousereg[::-1]:
  124             if scr is _scr and x <= _x < x+w and y <= _y < y+h and button in kwargs:
  125                 return kwargs[button]
  126 
  127     @property
  128     def screenHeight(self):
  129         return self.scrFull.getmaxyx()[0] if self.scrFull else 25
  130 
  131     @property
  132     def screenWidth(self):
  133         return self.scrFull.getmaxyx()[1] if self.scrFull else 80
  134
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/visidata/vdobj.py b/visidata/vdobj.py
  --- a/visidata/vdobj.py
  +++ b/visidata/vdobj.py
  @@ -32,6 +32,7 @@
           'Make global func() and identical vd.func()'
           def _vdfunc(*args, **kwargs):
               return func(visidata.vd, *args, **kwargs)
  +        visidata.vd.addGlobals({func.__name__: func})
           setattr(cls, func.__name__, func)
           return wraps(func)(_vdfunc)
  
verification_info: {"golden_diff": "diff --git a/visidata/vdobj.py b/visidata/vdobj.py\n--- a/visidata/vdobj.py\n+++ b/visidata/vdobj.py\n@@ -32,6 +32,7 @@\n         'Make global func() and identical vd.func()'\n         def _vdfunc(*args, **kwargs):\n             return func(visidata.vd, *args, **kwargs)\n+        visidata.vd.addGlobals({func.__name__: func})\n         setattr(cls, func.__name__, func)\n         return wraps(func)(_vdfunc)\n", "issue": "Fix documentation on website\nNot sure if this belongs here, but I believe to have found a small issue on the website.\r\n\r\nParagraph # 7 in [10 Ways to Use VisiData](https://www.visidata.org/blog/2020/ten/) says you should use `visidata.view_pandas(df)` to view a dataframe in pandas.\r\n\r\nI believe that should be `visidata.vd.view_pandas(df)`\r\n\r\n![image](https://user-images.githubusercontent.com/14904570/158566552-df4f22c0-cb08-476c-a2d9-076577ebad5c.png)\r\n\n", "before_files": [{"content": "from functools import wraps\nfrom unittest import mock\nimport curses\n\nimport visidata\n\n__all__ = ['ENTER', 'ALT', 'ESC', 'asyncthread', 'VisiData']\n\n\nENTER='Enter'\nALT=ESC='^['\n\n\n# define @asyncthread for potentially long-running functions\n#   when function is called, instead launches a thread\ndef asyncthread(func):\n    'Function decorator, to make calls to `func()` spawn a separate thread if available.'\n    @wraps(func)\n    def _execAsync(*args, **kwargs):\n        if args and isinstance(args[0], visidata.BaseSheet):  #1136: allow cancel of async methods on Sheet\n            if 'sheet' not in kwargs:\n                kwargs['sheet'] = args[0]\n        return visidata.vd.execAsync(func, *args, **kwargs)\n    return _execAsync\n\n\nclass VisiData(visidata.Extensible):\n    allPrefixes = ['g', 'z', ESC]  # embig'g'en, 'z'mallify, ESC=Alt/Meta\n\n    @classmethod\n    def global_api(cls, func):\n        'Make global func() and identical vd.func()'\n        def _vdfunc(*args, **kwargs):\n            return func(visidata.vd, *args, **kwargs)\n        setattr(cls, func.__name__, func)\n        return wraps(func)(_vdfunc)\n\n    def __init__(self):\n        self.sheets = []  # list of BaseSheet; all sheets on the sheet stack\n        self.allSheets = []  # list of all non-precious sheets ever pushed\n        self.lastErrors = []\n        self.keystrokes = ''\n        self.scrFull = mock.MagicMock(__bool__=mock.Mock(return_value=False))  # disable curses in batch mode\n        self._cmdlog = None\n        self.contexts = [self]  # objects whose attributes are in the fallback context for eval/exec.\n\n    def sheetstack(self, pane=0):\n        'Return list of sheets in given *pane*. pane=0 is the active pane.  pane=-1 is the inactive pane.'\n        if pane == -1:\n            return list(vs for vs in self.sheets if vs.pane and (vs.pane != self.activePane))\n        else:\n            return list(vs for vs in self.sheets if vs.pane == (pane or self.activePane))\n\n    @property\n    def stackedSheets(self):\n        return list(vs for vs in self.sheets if vs.pane)\n\n    @property\n    def activeSheet(self):\n        'Return top sheet on sheets stack, or cmdlog if no sheets.'\n        for vs in self.sheets:\n            if vs.pane and vs.pane == self.activePane:\n                return vs\n\n        for vs in self.sheets:\n            if vs.pane and vs.pane != self.activePane:\n                return vs\n\n        return self._cmdlog\n\n    @property\n    def activeStack(self):\n        return self.sheetstack() or self.sheetstack(-1)\n\n    @visidata.drawcache_property\n    def mousereg(self):\n        return []\n\n    def __copy__(self):\n        'Dummy method for Extensible.init()'\n        pass\n\n    def finalInit(self):\n        'Initialize members specified in other modules with init()'\n        pass\n\n    @classmethod\n    def init(cls, membername, initfunc, **kwargs):\n        'Overload Extensible.init() to call finalInit instead of __init__'\n        oldinit = cls.finalInit\n        def newinit(self, *args, **kwargs):\n            oldinit(self, *args, **kwargs)\n            setattr(self, membername, initfunc())\n        cls.finalInit = newinit\n        super().init(membername, lambda: None, **kwargs)\n\n    def clearCaches(self):\n        'Invalidate internal caches between command inputs.'\n        visidata.Extensible.clear_all_caches()\n\n    def getkeystroke(self, scr, vs=None):\n        'Get keystroke and display it on status bar.'\n        k = None\n        try:\n            scr.refresh()\n            k = scr.get_wch()\n            vs = vs or self.activeSheet\n            if vs:\n                self.drawRightStatus(vs._scr, vs) # continue to display progress %\n        except curses.error:\n            return ''  # curses timeout\n\n        if isinstance(k, str):\n            if ord(k) >= 32 and ord(k) != 127:  # 127 == DEL or ^?\n                return k\n            k = ord(k)\n        return curses.keyname(k).decode('utf-8')\n\n    def onMouse(self, scr, y, x, h, w, **kwargs):\n        self.mousereg.append((scr, y, x, h, w, kwargs))\n\n    def getMouse(self, _scr, _x, _y, button):\n        for scr, y, x, h, w, kwargs in self.mousereg[::-1]:\n            if scr is _scr and x <= _x < x+w and y <= _y < y+h and button in kwargs:\n                return kwargs[button]\n\n    @property\n    def screenHeight(self):\n        return self.scrFull.getmaxyx()[0] if self.scrFull else 25\n\n    @property\n    def screenWidth(self):\n        return self.scrFull.getmaxyx()[1] if self.scrFull else 80\n", "path": "visidata/vdobj.py"}], "after_files": [{"content": "from functools import wraps\nfrom unittest import mock\nimport curses\n\nimport visidata\n\n__all__ = ['ENTER', 'ALT', 'ESC', 'asyncthread', 'VisiData']\n\n\nENTER='Enter'\nALT=ESC='^['\n\n\n# define @asyncthread for potentially long-running functions\n#   when function is called, instead launches a thread\ndef asyncthread(func):\n    'Function decorator, to make calls to `func()` spawn a separate thread if available.'\n    @wraps(func)\n    def _execAsync(*args, **kwargs):\n        if args and isinstance(args[0], visidata.BaseSheet):  #1136: allow cancel of async methods on Sheet\n            if 'sheet' not in kwargs:\n                kwargs['sheet'] = args[0]\n        return visidata.vd.execAsync(func, *args, **kwargs)\n    return _execAsync\n\n\nclass VisiData(visidata.Extensible):\n    allPrefixes = ['g', 'z', ESC]  # embig'g'en, 'z'mallify, ESC=Alt/Meta\n\n    @classmethod\n    def global_api(cls, func):\n        'Make global func() and identical vd.func()'\n        def _vdfunc(*args, **kwargs):\n            return func(visidata.vd, *args, **kwargs)\n        visidata.vd.addGlobals({func.__name__: func})\n        setattr(cls, func.__name__, func)\n        return wraps(func)(_vdfunc)\n\n    def __init__(self):\n        self.sheets = []  # list of BaseSheet; all sheets on the sheet stack\n        self.allSheets = []  # list of all non-precious sheets ever pushed\n        self.lastErrors = []\n        self.keystrokes = ''\n        self.scrFull = mock.MagicMock(__bool__=mock.Mock(return_value=False))  # disable curses in batch mode\n        self._cmdlog = None\n        self.contexts = [self]  # objects whose attributes are in the fallback context for eval/exec.\n\n    def sheetstack(self, pane=0):\n        'Return list of sheets in given *pane*. pane=0 is the active pane.  pane=-1 is the inactive pane.'\n        if pane == -1:\n            return list(vs for vs in self.sheets if vs.pane and (vs.pane != self.activePane))\n        else:\n            return list(vs for vs in self.sheets if vs.pane == (pane or self.activePane))\n\n    @property\n    def stackedSheets(self):\n        return list(vs for vs in self.sheets if vs.pane)\n\n    @property\n    def activeSheet(self):\n        'Return top sheet on sheets stack, or cmdlog if no sheets.'\n        for vs in self.sheets:\n            if vs.pane and vs.pane == self.activePane:\n                return vs\n\n        for vs in self.sheets:\n            if vs.pane and vs.pane != self.activePane:\n                return vs\n\n        return self._cmdlog\n\n    @property\n    def activeStack(self):\n        return self.sheetstack() or self.sheetstack(-1)\n\n    @visidata.drawcache_property\n    def mousereg(self):\n        return []\n\n    def __copy__(self):\n        'Dummy method for Extensible.init()'\n        pass\n\n    def finalInit(self):\n        'Initialize members specified in other modules with init()'\n        pass\n\n    @classmethod\n    def init(cls, membername, initfunc, **kwargs):\n        'Overload Extensible.init() to call finalInit instead of __init__'\n        oldinit = cls.finalInit\n        def newinit(self, *args, **kwargs):\n            oldinit(self, *args, **kwargs)\n            setattr(self, membername, initfunc())\n        cls.finalInit = newinit\n        super().init(membername, lambda: None, **kwargs)\n\n    def clearCaches(self):\n        'Invalidate internal caches between command inputs.'\n        visidata.Extensible.clear_all_caches()\n\n    def getkeystroke(self, scr, vs=None):\n        'Get keystroke and display it on status bar.'\n        k = None\n        try:\n            scr.refresh()\n            k = scr.get_wch()\n            vs = vs or self.activeSheet\n            if vs:\n                self.drawRightStatus(vs._scr, vs) # continue to display progress %\n        except curses.error:\n            return ''  # curses timeout\n\n        if isinstance(k, str):\n            if ord(k) >= 32 and ord(k) != 127:  # 127 == DEL or ^?\n                return k\n            k = ord(k)\n        return curses.keyname(k).decode('utf-8')\n\n    def onMouse(self, scr, y, x, h, w, **kwargs):\n        self.mousereg.append((scr, y, x, h, w, kwargs))\n\n    def getMouse(self, _scr, _x, _y, button):\n        for scr, y, x, h, w, kwargs in self.mousereg[::-1]:\n            if scr is _scr and x <= _x < x+w and y <= _y < y+h and button in kwargs:\n                return kwargs[button]\n\n    @property\n    def screenHeight(self):\n        return self.scrFull.getmaxyx()[0] if self.scrFull else 25\n\n    @property\n    def screenWidth(self):\n        return self.scrFull.getmaxyx()[1] if self.scrFull else 80\n", "path": "visidata/vdobj.py"}]}