答案1
我只看到三种解决这个问题的可能方法;前两种已经被否决了;也许第三种会起作用。
更改设置:据我所知,这些设置可以接近您的要求,但不会完全满足您的需求。我不认为这些设置适合您。
使用快捷方式作为解决方法:这可以自动打开一个文件并关闭所有其他文件,但不允许您使用从 Windows 资源管理器双击文件来启动该过程。
使用脚本插件将操作挂接到 Notepad++ 中的文件打开事件中。也许你不会拒绝这个,尽管这会花费你最多的工作量。
之后对每种方法进行了更详细的描述,而由于我对答案进行了编辑,较旧的方法被推到了较低的位置。
三:使用脚本插件
使用 PythonScript 插件(或者 LuaScript 插件,或者可能是 jN Notepad++ 插件),可以将钩子(“注册回调”)附加到在 Notepad++ 中打开文件后触发的事件(在 PythonScript 中,这称为事件NOTIFICATION.FILEOPENED
,在记事本对象)。该函数需要关闭除最近打开的文件之外的所有文件。
实际上,除了这些之外,没有太多内容了。即使使用包装器,也只有几行代码,所以我会为您编写。
# encoding=utf-8
"""in response to https://superuser.com/questions/1412875"""
from Npp import *
def su1412882_OnOpen_callback(kwargs):
"""this is the function that will be called when a new file is opened"""
notepad.activateBufferID(kwargs['bufferID'])
notepad.closeAllButCurrent()
def register_OnOpen_callback():
"""Registers the OnOpen callback"""
unregister_OnOpen_callback() # starts by making sure there are none registered
notepad.callback(su1412882_OnOpen_callback, [NOTIFICATION.FILEOPENED])
def unregister_OnOpen_callback():
"""Unregisters the OnOpen callback - used to make sure that running the script twice doesn't register two instances of the same callback"""
notepad.clearCallbacks(su1412882_OnOpen_callback)
if __name__ == '__main__': register_OnOpen_callback()
一度:
- 安装 PythonScript(在 v7.6.3 或更高版本中使用插件管理,或在 v7.5.9 或更早版本中使用插件管理器插件),重新启动 Notepad++
- 插件 > Python 脚本 > 新脚本. 在建议的默认目录中将其命名为“closeAllButRecent.py”
- 将上面的代码粘贴到文件中,然后保存。
- 插件 > Python 脚本 > 配置...,从 初始化: 更改
LAZY
为ATSTARTUP
。 - 插件 > Python 脚本 > 脚本,然后ctrl+click继续
startup
。 - 将以下几行添加到末尾
startup.py
,然后保存。
import closeAllButRecent
closeAllButRecent.register_OnOpen_callback()
- 重新启动 Notepad++
从现在开始,它应该关闭除打开的文件之外的所有内容。
哦,你也会想要设置>首选项>备份>记住当前会话被关闭,否则当您第一次打开时,可能会打开第二个文件(但是,在此之后,如果您打开一个文件,它将自动关闭所有已打开的文件)。
如果您想撤消此操作,只需注释掉这两行startup.py
并重新启动 Notepad++;之后,Notepad++ 将允许您再次编辑多个文件。
二:使用快捷方式作为解决方法
受到@Toto 的评论的启发另一个答案,如果使用宏,则可以为多个操作分配快捷方式。
- 关闭 Notepad++ 的所有实例,然后重新加载 Notepad++ 的一个实例(这可确保所有待处理的设置更改均已生效)
- 编辑
%AppData%\Notepad++\shortcuts.xml
,并在<macros>
部分中添加:
<Macro name="Close All then Open New" Ctrl="no" Alt="no" Shift="no" Key="0">
<Action type="2" message="0" wParam="41004" lParam="0" sParam="" />
<Action type="2" message="0" wParam="41002" lParam="0" sParam="" />
</Macro>
- 保存。退出 Notepad++。重新加载 notepad++。
- 运行该宏(通过宏 > 关闭全部然后打开新)将关闭所有打开的文件,然后弹出文件 > 打开对话
- 如果你愿意,可以添加键盘快捷键宏 > 修改快捷方式,选择
Close All then Open New
,然后选择一个您能记住的快捷方式。
这不会影响 Windows 资源管理器RClick > 使用 Notepad++ 打开或 Notepad++ 的文件 > 打开。但它将为您提供一种通过一个菜单命令或按键来自动执行该过程的方法。
感谢@Toto 提出这个想法。
第一:无法通过设置完成(原始回应,经编辑)
如果您禁用设置 > 首选项 > 备份 > ☐ 记住当前会话以供下次启动,那么 Notepad++ 将不会尝试记住之前打开过哪些文件,而是直接以你用来启动 Notepad++ 的文件开始——如果你只是点击了快捷方式,那么就是一个空白文件;如果你是从 Windows 资源管理器或类似程序启动的,那么就是你正在编辑的任何文件
更新:您的说明确实帮助我理解了您的意图。如果您更改快捷方式(以及任何注册表项)以包含选项-nosession -notabbar
,那么我相信它会按照您想要的方式运行:当您首次运行 Notepad++ 时,它不会记住之前打开的文件(即强制禁用☐ Remember current session for next launch
),和它没有标签栏,(我认为)这会限制您一次只能打开一个文件。我从未使用过这种模式。
你需要小心,因为有一个asNotepad.xml
文件(见这里和这里asNotepad.xml
有关详细信息,请在每个页面中搜索),如果找到,将运行 Notepad++,假设-multiInst -nosession -notabbar
选项始终启用——-multiInst
允许运行多个 Notepad++ 副本(类似于 Windows 能够notepad.exe
同时打开多个副本)。由于您担心内存问题,因此您不希望同时打开多个 Notepad++ 实例。多实例模式的另一个问题是,如果您在一在打开的 Notepad++ 实例中,它们不会传播到其他实例...并且保存到磁盘的最终设置将是最后关闭的实例的设置。
更新 2:我刚刚进行了一些实验。 -notabbar
还不够:如果你用-notabbar
active 打开第二个文件,它仍然会打开两个文件,就像从 Notepad++ 中看到的那样窗户菜单,它仍会列出两个打开的文件。所以现在我的答案是:
抱歉,不可以,您无法在 Notepad++ 正在运行时打开新文件时自动关闭先前打开的文件。