更新
上一任务帖中,在行头和行尾插入行号的任务一般做法是:先使用 0 跳到行头,使用 i 执行向前插入;使用 $ 跳到行尾,使用 a 执行向后插入。新版的 VC 助手有个功能很实用,当你鼠标停留在某个单词
- I 键。在行头插入,相当于 0 + i;
- A 键。在行尾插入,相当于 $ + a;
- # 键。自动寻找当前位置单词的匹配;
在当前行上移动光标:
- ^ 键。移到本行第一个非 Blank 字符。和 0 的区别体现在如果行首是空格、TAB之类的时候;
- g_ 键。移到本行最后一个不是 Blank 字符的位置。与 $ 相对应;
- fa 键。本行下一个为 a 的字符处;
- Fa 键。本行上一个为 a 的字符处(与 f 方向相反);
- ta 键。本行下一个为 a 的前一个字符处;
- Ta 键。本行上一个为 a 的后一个字符处(与 t 方向相反);

t 与 d 结合使用有时候有很有效果的,例如:删除本行从这里开始的内容,直到遇到双引号 dt";双引号可以换成其他任意符号和字母,f 键也可以这么用,区别在于 f 所指定的符号也将被删去,而 t 指定的不会(因为它只停留在符号前)。
任务帖
- 从 ^ 的位置删除到空格为止(df + 空格);
- 删除括号内空(找到括号内第一个字母,dt ));
- 进行10处删除,至任意字母为止;
附录
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "app/menus/menu_model.h"
namespace menus {
bool MenuModel::IsVisibleAt(int index) const {
return true;
}
bool MenuModel::GetModelAndIndexForCommandId(int command_id,
MenuModel** model, int* index) {
int item_count = (*model)->GetItemCount();
for (int i = 0; i < item_count; ++i) {
if ((*model)->GetTypeAt(i) == TYPE_SUBMENU) {
MenuModel* submenu_model = (*model)->GetSubmenuModelAt(i);
if (GetModelAndIndexForCommandId(command_id, &submenu_model, index)) {
*model = submenu_model;
return true;
}
}
if ((*model)->GetCommandIdAt(i) == command_id) {
*index = i;
return true;
}
}
return false;
}
// Default implementation ignores the disposition.
void MenuModel::ActivatedAtWithDisposition(int index, int disposition) {
ActivatedAt(index);
}
} // namespac
注:Chrome 代码片段。