组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?> $v = implode(",", $v);
$temp[] = $v;
}
// 去掉重复的字符串,也就是重复的一维数组
$temp = array_unique($temp);
// 再将拆开的数组重新组装
$output = array();
foreach ($temp as $k => $v) {
if ($stkeep) $k = $starr[$k];
if ($ndformat) {
$temparr = explode(",", $v);
foreach ($temparr as $ndkey => $ndval) $output[$k][$ndarr[$ndkey]] = $ndval;
} else $output[$k] = explode(",", $v);
}
return $output;
}
// 合并二维数组 如重复 值以第一个数组值为准
function array2_merge($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array1 as $k => $v) {
isset($v[$key]) ? $arr[$v[$key]] = array_merge($v, $array2[$k]) : $arr[] = array_merge($v, $array2[$k]);
}
return $arr;
}
/*
* 对二维数组排序 两个数组必须有一个相同的键值
* $array1 需要排序数组
* $array2 按照该数组key排序
* */
function array2_sort_key($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array2 as $k => $v) {
if (isset($v[$key]) && $v[$key] == $array1[$v[$key]][$key]) {
$arr[$v[$key]] = $array1[$v[$key]];
} else {
$arr[] = $v;
}
}
return $arr;
}
?>
Linux系统——vim按键说明编程频道|福州电脑网
Linux系统——vim按键说明
编程之家920
更新时间:2026-04-03 20:27:18
vim按键说明
第一部分:一般命令模式可用的功能按键说明,光标移动、复制粘贴、查找替换等
移动光标
光标左移一个字符:h、左箭头⬅
光标右移一个字符:l、右箭头→
光标上移一个字符:k、上箭头↑
光标下移一个字符:j、下箭头↓
移动多行,则30j下移30行、10k上移10
向下移动一页:ctrl + f 、Page Down
向上移动一页:ctrl + b、Page Up
向下移动半页:ctrl + d
向上移动半页:ctrl+u
光标移动到非空格符的下一行:+
光标移动到非空格符的上一行:-
当前行,光标右移n个字符:n+space
移动到当前行最前字符处:0、Home
移动到当前行最后字符:$、End
移动到当前文件的最后一行:G
移动当这个文件的第n行:nG
移动到这个文件的第一行:1G、gg
光标向下移动n行:n+Enter
光标移动到当前屏幕最上方那一行的第一个字符:H
光标移动到当前屏幕中央那一行的第一个字符:M
光标移动到当前屏幕最下方那一行的第一个字符:L
查找与替换
向光标下查找“word”字符串:/word
向光标上查找“word”字符串:?word
查找下一个被查找的字符,与上方向同步:n
查找下一个被查找的字符,与上方向相反:N
在n1与n2行之间查找字符串“word”,并替换为“word1”::n1,n2/word/word1/g
从第一行到最后一行之间查找字符串“word”,并替换为“word1”::1,$s/word/word1/g
从第一行到最后一行之间查找字符串“word”,并替换为“word1”,提示用户确认::1,$s/word/word1/gc
删除、复制与粘贴
x与X:x向后删除一个字符(del建),X向前删除一个字符
nX:n为数字,连续向后删除n个字符
dd:删除光标所在的整行
ndd:删除光标所在的向下n行
d1G:删除光标所在行到第一行的所有数据
dG:删除光标所在行到最后一行的所有数据
d$:删除光标所在处,到该行的最后一个字符
yy:复制光标所在的那一行
nyy:n为数字,复制光标所在的向下n行
y1G:复制光标所在行到第一行的所有数据
yG:复制光标所在行到最后一行的所有数据
y0:复制光标所在的那个字符到该行行首的所有数据
y$:复制光标所在的那个字符到该行行尾的所有数据
p与P:p将已复制的数据在光标下一行粘贴,P则为粘贴在光标的上一行
J:将光标所在行与下一行的数据结合成同一行
c:重复删除多个数据,例如向下删除10行,10cj
u:恢复前一个操作
ctrl+r:重做上一个操作
.:重复前一个操作
第二部分;一般命令模式切换到编辑模式的可用的按键说明
进入插入或替换的编辑模式
i与l:进入插入模式,i为从当前光标处插入,l为在目前所在行第一个非空格字符处开始插入
a与A:进入插入模式,a为从当前光标所在的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入
o与O:进入插入模式,o为在目前光标所在行的下一行插入新的一行;O为在目前光标所在行的上一行插入新的一行
r与R:进入替换模式,r只会替换光标做的那一个字符一次;R会一直替换光标所在的文字,esc结束
第三部分:一般命令模式切换到命令行模式的可以按键说明
命令行模式的保存、退出等命令
:w 将编辑的数据写入硬盘文件中
:w! 若文件属性是【只读】,强制写入该文件,最后能否写入,仍然与你对该文件的文件权限有关
:q 退出vi、vim
:q! 强制退出不保存
:wq 保存后退出,:wq!强制保存后退出
ZZ 若文件没有修改,则不保存退出,若文件已修改,则保存退出
:w [filename] 将编辑的数据保存成另一个文件(类似另存新文件)
:r [filename] 在编辑的数据中,读入另一个文件的数据,集将这个文件的数据追加到光标所在行后面
:n1,n2 w [filename] 将n1到n2行的内容保存为filename文件
vim环境的修改
:set nu 显示行号,每行的前缀显示行号
:set nonu 取消显示行号
本文发布于:2025-05-16,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:按键系统linuxvim
发布评论