Tôi có một tiện ích (grep) cung cấp cho tôi danh sách tên tệp và số dòng. Sau khi tôi đã xác định rằng devenv là chương trình chính xác để mở một tệp, tôi muốn đảm bảo rằng nó được mở ở số dòng được chỉ định. Trong emacs, điều này sẽ là:Mở một tệp trong Visual Studio tại một số dòng cụ thể
emacs +140 filename.c
Tôi không tìm thấy gì giống như thế này cho Visual Studio (devenv). Gần nhất tôi đã tìm thấy là:
devenv /Command "Edit.Goto 140" filename.c
Tuy nhiên, điều này tạo ra một bản sao riêng biệt cho từng tệp như vậy. Tôi thà có cái gì đó sử dụng một ví dụ hiện có.
Những biến thể tái sử dụng một devenv hiện có, nhưng không đi vào dòng chỉ:
devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command /Edit filename.c "Edit.Goto 140"
Tôi nghĩ rằng việc sử dụng nhiều "/ Command" lý lẽ có thể làm điều đó, nhưng tôi có lẽ không có một trong những quyền bởi vì tôi hoặc là có được lỗi hoặc không có phản ứng nào cả (ngoài việc mở một devenv trống).
Tôi có thể viết một macro đặc biệt cho devenv, nhưng tôi muốn tiện ích này được sử dụng bởi những người khác không có macro đó. Và tôi không rõ về cách gọi macro đó bằng tùy chọn "/ Lệnh".
Bất kỳ ý tưởng nào?
Vâng, có vẻ như không có cách nào để làm điều này như tôi muốn. Vì có vẻ như tôi sẽ cần có mã chuyên dụng để khởi động Visual Studio, tôi đã quyết định sử dụng EnvDTE như hình dưới đây. Hy vọng rằng điều này sẽ giúp người khác.
#include "stdafx.h"
//-----------------------------------------------------------------------
// This code is blatently stolen from http://benbuck.com/archives/13
//
// This is from the blog of somebody called "BenBuck" for which there
// seems to be no information.
//-----------------------------------------------------------------------
// import EnvDTE
#pragma warning(disable : 4278)
#pragma warning(disable : 4146)
#import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
#pragma warning(default : 4146)
#pragma warning(default : 4278)
bool visual_studio_open_file(char const *filename, unsigned int line)
{
HRESULT result;
CLSID clsid;
result = ::CLSIDFromProgID(L"VisualStudio.DTE", &clsid);
if (FAILED(result))
return false;
CComPtr<IUnknown> punk;
result = ::GetActiveObject(clsid, NULL, &punk);
if (FAILED(result))
return false;
CComPtr<EnvDTE::_DTE> DTE;
DTE = punk;
CComPtr<EnvDTE::ItemOperations> item_ops;
result = DTE->get_ItemOperations(&item_ops);
if (FAILED(result))
return false;
CComBSTR bstrFileName(filename);
CComBSTR bstrKind(EnvDTE::vsViewKindTextView);
CComPtr<EnvDTE::Window> window;
result = item_ops->OpenFile(bstrFileName, bstrKind, &window);
if (FAILED(result))
return false;
CComPtr<EnvDTE::Document> doc;
result = DTE->get_ActiveDocument(&doc);
if (FAILED(result))
return false;
CComPtr<IDispatch> selection_dispatch;
result = doc->get_Selection(&selection_dispatch);
if (FAILED(result))
return false;
CComPtr<EnvDTE::TextSelection> selection;
result = selection_dispatch->QueryInterface(&selection);
if (FAILED(result))
return false;
result = selection->GotoLine(line, TRUE);
if (FAILED(result))
return false;
return true;
}
Tuyệt vời. Vì vậy, bạn gọi điều này với "devenv/lệnh Macros.MyMacros.visual_studio_open_file myFile someLineNumber"? – EndangeredMassa
Không, đây chỉ là mã để mở một tệp với phiên bản hiện tại của devenv. Ý tưởng là nếu tôi phải có mã chuyên biệt để mở tệp, đây là mã đó. Xin lỗi tôi đã không liên hệ lại với bạn trước đây, tôi vừa mới nhận thấy nhận xét của bạn. –
Tôi tự hỏi nếu có ai có một cách sạch hơn để làm điều này như của VS 2010? –