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()

```

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)

{"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"}]}