Запрос WMI:
"Select * from Win32_OperatingSystem"
РЕДАКТИРОВАНИЕ: На самом деле лучше был бы:
"Select Version from Win32_OperatingSystem"
Вы могли реализовать это в Дельфи как так:
function OperatingSystemDisplayName: string;
function GetWMIObject(const objectName: string): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, PChar(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
function VarToString(const Value: OleVariant): string;
begin
if VarIsStr(Value) then begin
Result := Trim(Value);
end else begin
Result := '';
end;
end;
function FullVersionString(const Item: OleVariant): string;
var
Caption, ServicePack, Version, Architecture: string;
begin
Caption := VarToString(Item.Caption);
ServicePack := VarToString(Item.CSDVersion);
Version := VarToString(Item.Version);
Architecture := ArchitectureDisplayName(SystemArchitecture);
Result := Caption;
if ServicePack <> '' then begin
Result := Result + ' ' + ServicePack;
end;
Result := Result + ', version ' + Version + ', ' + Architecture;
end;
var
objWMIService: OleVariant;
colItems: OleVariant;
Item: OleVariant;
oEnum: IEnumvariant;
iValue: LongWord;
begin
Try
objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
colItems := objWMIService.ExecQuery('SELECT Caption, CSDVersion, Version FROM Win32_OperatingSystem', 'WQL', 0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
if oEnum.Next(1, Item, iValue)=0 then begin
Result := FullVersionString(Item);
exit;
end;
Except
// yes, I know this is nasty, but come what may I want to use the fallback code below should the WMI code fail
End;
(* Fallback, relies on the deprecated function GetVersionEx, reports erroneous values
when manifest does not contain supportedOS matching the executing system *)
Result := TOSVersion.ToString;
end;
См. Также : h undo-redo
, в котором перечислены все команды и их использование.
Есть два способа пройти по дереву отмены. Один - вернуться «в прошлое». g +
и g-
будут проходить все узлы в дереве в хронологическом или обратном хронологическом порядке (что может немного сбивать с толку, потому что может произвольно переходить между ветвями отмены, но если вы будете делать g-
достаточно долго, вы всегда доберетесь туда, куда вам нужно идти). : ранее
и : позже
принимают дескриптор времени, например 7m
или 1h
; опять же, вы можете произвольно переключаться между ветвями отмены.
Другой способ - перейти к определенным узлам в дереве, используя : undo n
, где n
- это номер действия. (Все действия, т. е. добавления, удаления, замены текста нумеруются последовательно по мере их выполнения.) Вы можете посмотреть количество действий на листьях дерева отмены с помощью : undolist
. Это позволит вам легко перепрыгивать между ветками. Затем вы можете использовать u
и Ctrl-R
для перемещения вверх и вниз по этой ветке.
В справке Vim есть несколько хороших примеров. Лучший способ понять, как это работает, - немного поиграться с этим.
На этой странице объясняется все, что вам нужно знать:
If you're using vim, you can navigate through the undo tree using:
u
: (undo) move back in the undo treeCtrl+R
: (redo) move forward in the undo treeOther ways of bringing document back or forward in time:
:earlier 15m
: move back in time 15 minutes:later 15m
: move front in time 15 minutes