【问题标题】:Is there a way to jump to last edited cell in Jupyter?有没有办法跳到 Jupyter 中最后编辑的单元格?
【发布时间】:2018-08-13 12:29:53
【问题描述】:

通常在 Jupyter 中,我会移动到笔记本的不同部分来查看某些内容,完成后我想跳回到我之前工作的地方。现在我必须导航到最近的 Markdown 部分(通过 Jupyter Notebook Extensions)并向上或向下移动以到达我所在的位置。有没有办法直接跳转到我进行编辑的最后一个单元格(最好通过键盘快捷键)?谢谢!

【问题讨论】:

  • 在 JupyterLab 中,您可以使用 jupyterlab-lsp 扩展,它具有“跳转到”功能和相应的“跳转回”功能,两者都绑定到可自定义的快捷方式。由于标签是“Jupyter Notebook”而不是“Jupyter”或“JupyterLab”,因此未添加作为答案。

标签: jupyter-notebook


【解决方案1】:

echap 进入命令模式,然后Ctrl + z 将撤消您的最后更改,这会将焦点放在最后编辑的单元格上。 ctrl + y 将重做最后一次修改。

(仅在python3内核上测试)

编辑实际上,如果您只按一次ctrl + z,您只会获得焦点部分,而不会修改您的单元格。然后按enter 进入编辑模式,将页面滚动到活动单元格。

【讨论】:

  • 它不适用于 jupyter lab 或 jupyter 树。 ctrl + z 仅用于撤消当前选定的编辑。它不会跳转到最后编辑的单元格。即使撤消了最后一个编辑的单元格,我认为它不会跳转到它...因为撤消是无声地发生的..远离页面..这是我的经验和观察...没有解决方案据我所知,在jupyter笔记本中为此。例如在 microsoft word shift + f5 将您带到文档中的最后一个位置。
【解决方案2】:

理想情况下,这当然是一个内置的快捷方式,但与此同时:

选项 1:自定义 JavaScript

如果你获得了像Custom JavaScript for Websites 2(开源)这样的浏览器扩展,那么你可以使用此代码记录一堆滚动位置历史并使用Ctrl+Shift+X向后跳转:

// Visit JupyterLab in browser and click the Custom JS browser extension icon and then paste this:
if(location.href.startsWith("http://localhost:8888/lab")) {
  let scrollLocationsHistories = new Map();
  let scrollBinHeight = 100;
  window.addEventListener("keydown", (e) => {
    let notebookEl = document.querySelector(".jp-mod-searchable .jp-NotebookPanel-notebook");
    if(!scrollLocationsHistories.has(notebookEl)) scrollLocationsHistories.set(notebookEl, [])
    let scrollLocationsHistory = scrollLocationsHistories.get(notebookEl);
    if(e.ctrlKey && e.shiftKey && e.key === "X") {
      if(scrollLocationsHistory.length > 0) {
        e.preventDefault();
        let origScrollPos = notebookEl.scrollTop;
        notebookEl.scrollTo(0, scrollLocationsHistory.pop()*scrollBinHeight);
        let newScrollPos = notebookEl.scrollTop;
        if(Math.abs(origScrollPos-newScrollPos) < scrollBinHeight && scrollLocationsHistory.length > 0) {
          notebookEl.scrollTo(0, scrollLocationsHistory.pop()*scrollBinHeight); // jump back again because last edit position was close to current position
        } 
        console.log("Scroll History (newest locations at end):", scrollLocationsHistory.map(v => v*scrollBinHeight))
      }
    } else if(!e.ctrlKey && !e.shiftKey && document.activeElement.tagName.toLowerCase() === "textarea") {
      let scrollBin = Math.round(notebookEl.scrollTop/scrollBinHeight);
      if(scrollLocationsHistory[scrollLocationsHistory.length-1] !== scrollBin) {
        scrollLocationsHistory.push(scrollBin);
        if(scrollLocationsHistory.length > 500) scrollLocationsHistory = scrollLocationsHistory.slice(-250);
      }
    }
  });
}

这只是一个初始原型,但到目前为止它似乎工作得很好。您可能需要稍微调整一下 - 例如scrollBinHeight 导致在scrollBinHeight 像素范围内的附近编辑不会创建第二个历史条目。您需要编辑 http://localhost:8888/lab 以匹配您要启用它的 URL。如果你在我写完这篇文章很久之后才读到这篇文章,那么你可能还需要更改document.querySelector(".jp-mod-searchable .jp-NotebookPanel-notebook")(即活动笔记本的主要滚动元素),以防他们更新了 HTML 类名或 HTML 结构。

选项 2:经常弃牌

另一个可能的选择(根据您的用例可能不切实际)是习惯于折叠您当前未处理的单元格。这使得在您正在处理的单元格之间快速滚动变得非常容易。

选项 3:搜索黑客

如果您正在处理一个特定的单元格,但经常需要跳转到另一个单元格,您可以在这两个单元格中添加类似 #vv 的评论(或任何易于键入的随机字符串),然后每当您需要在它们之间跳转,只需按Ctrl+F,然后按Enter。第一次执行此操作时,您显然需要在搜索框中输入vv,但之后它会被记住(除非您使用搜索另一个字符串)。这种方法的缺点是您需要从您不再处理的单元格中“修剪”#vvs。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2021-12-23
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多