要将Notepad ++用作7zip的编辑器,您需要使用--track-origins=no|yes show origins of undefined values? [no]
命令行参数启动notepad++.exe
,否则它会立即关闭并转发现有实例的参数。由于7zip会在调用的程序关闭时获取您对其临时文件所做的更改,因此您永远无法编辑它。
问题是,7zip不允许您为您正在配置为编辑器的任何程序输入参数。
已经尝试过的明显的解决方案:
-multiInst
来调用Notepad ++的批处理文件:无法正常工作,被调用的批处理文件立即关闭,因此Notepad ++已完成编辑,即回到初始问题。 你会怎么做?没有我自己尝试过或者读过的解决方案已经完全令人满意。
答案 0 :(得分:1)
我最终编写了自己的实用程序,暂时将其称为 NoConsoleProgramLauncher 以充当 7z 和 Notepad++ 之间的中间件。这是粗略的初稿代码,但我认为分享它可能仍然有用,因为这个问题已经三年没有答案了。
#include <fstream>
#include <string>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <filesystem>
HINSTANCE hInst;
void launchProcess(std::wstring commandLine);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//Get current executable's location
HMODULE hModule = GetModuleHandleW(NULL);
WCHAR executableFolder[MAX_PATH];
GetModuleFileNameW(hModule, executableFolder, MAX_PATH);
std::experimental::filesystem::v1::path path(executableFolder);
path.remove_filename();
path.append(L"NoConsoleProgramLauncher_Arguments.txt");
std::wifstream infile(path);
std::wstring commandLine;
std::getline(infile, commandLine);
commandLine += L" ";
commandLine += lpCmdLine;
launchProcess(commandLine);
}
void launchProcess(std::wstring commandLine)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
&commandLine[0], // Command line - C++ 11 guarantees that string's internal buffer is contiguous and null-terminated.
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NO_WINDOW, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
基本上,如果您之前做过最少的 C++ 编码,只需将其粘贴到新的 Visual Studio 2017 Windows 桌面应用程序项目中,根据需要修复包含,然后构建.
正如您在源代码中看到的那样,当启动可执行文件时,它会在与自身相同的文件夹中查找名为“NoConsoleProgramLauncher_Arguments.txt”的文件,并调用它在其中找到的命令行。如问题中所述,不会显示任何控制台窗口,并且程序将在退出之前等待生成的进程终止,因此 7zip 会一直等待获取更改。
这是我放入 NoConsoleProgramLauncher_Arguments.txt
文件的内容:
"C:\Program Files (x86)\Notepad++\notepad++.exe" -multiInst -nosession
在 7zip 配置中,我将编辑器设置为指向我的 NoConsoleProgramLauncher.exe 程序。
真正的解决方案当然是轻轻地纠缠 7z 作者,或者更好的是,向 7z 提交拉取请求以实现向您选择的编辑器传递参数。
答案 1 :(得分:0)
批处理文件怎么样
start "" /b "notepad++.exe" -multiInst $*
exit