2011年2月17日星期四

vim 常用命令


  • 0 到行首

  • $ 到行尾

  • ^ 到行首字母

  • ( 到上面一句或者上面一个代码段

  • ) 到下面一句或者下面一个代码段

  • `. 到最后一次修改的位置

  • / 搜索/指定文字,找到之后可使用n来跳到下一个相同单词位置

  • : 转跳到指定行数

  • :$ 转跳到文件末尾,这个和G的作用相同

  • i 插入模式,I也可以,还有a, A

  • o 在当前行下面建立新行,对应的有O,在当前行上面




  • v 进入区块选择

  • y 复制已经选择的区块

  • yy 复制当前行

  • d 剪切已经选择的区块

  • dd 剪切当前行

  • p 粘贴已经选择的区块




  • . 重复上次指令

  • 重复执行指定的指令




  • % 匹配花括号,方括号,括号等,用于例如跳转到对应的{}位置

  • gd 到达光标所在处函数或者变量的定义处

  • > 缩进代码,在v下可用

  • >> 缩进当前行代码

  • < 反缩进代码,在v下可用

  • << 反缩进当前行




搜索替换


简单替换表达式
替换命令可以在全文中用一个单词替换另一个单词
[bash]
:%s/four/4/g
[/bash]
%范围前缀表示在所有行中执行替换. 最后的g 标记表示替换行中的所有匹配点. 如果仅对当前行进行操作, 去掉%即可

如果有一个 thirtyfour 这样的单词, 上面的命令会出错. 这种情况下, 这个单词会被替换成 thirty4. 要解决这个问题, 用 \< 来指定匹配单词开头:
[bash]
:%s/\<four/4/g
[/bash]
显然, 这样在处理 fourty 的时候还是会出错. 还需要用\>来解决这个问题:
[bash]
:%s/\<four\>/4/g
[/bash]

如果只想替换注释中的 four, 而保留代码中的,由于这很难指定, 可在替换命令中加一个c标记, 这样, Vim 会在每次替换前提示:
[bash]
:%s/\<four\>/4/gc
[/bash]

删除多余的空格
要删除这些每行后面多余的空格, 可以执行如下命令:
[bash]
:%s/\s\+$//
[/bash]
命令前面指明范围是 %, 所以这会作用于整个文件. substitute 命令的匹配模式是 \s\+$. 这表示行末 ($) 前的一个或者多个 (\+) 空格(\s). 替换命令的 to 部分是空的: //. 这样就会删除那些匹配的空白字符.

匹配重复性模式
星号项* 规定在它前面的项可以重复任意次. 因此:
[bash]
/a*
[/bash]
匹配 a, aa, aaa, 等等. 但也匹配 (空字串), 因为零次也包含在内. 星号 * 仅仅应用于那个紧邻在它前面的项. 因此 ab* 匹配 a, ab, abb,abbb, 等等. 如要多次重复整个字符串, 那么该字符串必须被组成一个项. 组成一项的方法就是在它前面加 \(, 后面加 \). 因此这个命令:
[bash]
/\(ab\)*
[/bash]
匹配: ab, abab, ababab, 等等. 而且也匹配.

要避免匹配空字串, 使用 \+. 这表示前面一项可以被匹配一次或多次.
[bash]
/ab\+
[/bash]
匹配 ab, abb, abbb, 等等. 它不匹配 后面没有跟随 b 的 a.

要匹配一个可选项, 用 \=. 例如:
[bash]
/folders\=
[/bash]
匹配 folder 和 folders.

指定重复次数
要匹配某一项的特定次数重复, 使用 \{n,m} 这样的形式. 其中 n 和 m 都是数字. 在它前面的那个项将被重复 n 到 m 次 (|inclusive| 包含 n 和 m). 例如:
[bash]
/ab\{3,5}
[/bash]
匹配 abbb, abbbb 以及 abbbbb.

当 n 省略时, 被默认为零. 当 m 省略时, 被默认为无限大. 当 ,m 省略时, 就表示重复正好 n 次. 例如:
模式 匹配次数

  • \{,4} 0, 1, 2, 3 或 4

  • \{3,} 3, 4, 5, 等等

  • \{0,1} 0 或 1, 同 \=

  • \{0,} 0 或 更多, 同 *

  • \{1,} 1 或 更多, 同 \+

  • \{3} 3



多选一匹配
在一个查找模式中, 或运算符是 \|. 例如:
[bash]
/foo\|bar
[/bash]
这个命令匹配了 foo 或 bar. 更多的抉择可以连在后面:
[bash]
/one\|two\|three
[/bash]
匹配 one, two 或 three.

如要匹配其多次重复, 那么整个抉择结构须置于 \(\) 之间:
[bash]
/\(foo\|bar\)\+
[/bash]
这个命令匹配 foo, foobar, foofoo, barfoobar, 等等.

再举个例子:
[bash]
/end\(if\|while\|for\)
[/bash]
这个命令匹配 endif, endwhile 和 endfor

MySQL 应用小笔记

MySQL 挂起的调试


1. 附加到mysql
[bash]
root@gguo-laptop: gdb -p 1232
[/bash]
1232 是 MySQL 的PID
2. 显示当前线程
[bash]
(gdb) info threads
[/bash]
3.显示所有线程的回溯
[bash]
(gdb) thread apply all bt
[/bash]

MySQL BINARY


[sql]
mysql> SELECT * FROM tbl_4;
+----+-------+
| id | title |
+----+-------+
| 1 | 11 |
| 2 | 22 |
| 3 | 33 |
| 4 | aa |
| 5 | bb |
| 6 | cc |
| 7 | AA |
| 8 | BB |
| 9 | CC |
+----+-------+
9 rows in set (0.00 sec)

mysql> SELECT * FROM tbl_4 WHERE title LIKE 'a%';
+----+-------+
| id | title |
+----+-------+
| 4 | aa |
| 7 | AA |
+----+-------+
2 rows in set (0.00 sec)
[/sql]

[sql]
mysql> SELECT * FROM tbl_4 WHERE BINARY title LIKE 'a%';
+----+-------+
| id | title |
+----+-------+
| 4 | aa |
+----+-------+
1 row in set (0.00 sec)

mysql> SELECT * FROM tbl_4 WHERE BINARY title LIKE 'A%';
+----+-------+
| id | title |
+----+-------+
| 7 | AA |
+----+-------+
1 row in set (0.00 sec)
[/sql]

GROUP BY WITH ROLLUP


在 GROUP BY 结果的最后一行,列出所有行的总和,如下
[sql]
mysql> S ELECT COUNT(*), title FROM tbl_4 GROUP BY title WITH ROLLUP;
+----------+-------+
| COUNT(*) | title |
+----------+-------+
| 1 | 11 |
| 1 | 22 |
| 1 | 33 |
| 2 | aa |
| 2 | bb |
| 2 | cc |
| 9 | NULL |
+----------+-------+
7 rows in set (0.00 sec)
[/sql]

ORDER BY IF


排序时将某列中特定值排在最前,例如在如下排序中要把 aa 放在最前面:
[sql]
mysql> SELECT title FROM tbl_4 ORDER BY IF(title = 'aa', 0, 1), title;
+-------+
| title |
+-------+
| aa |
| AA |
| 11 |
| 22 |
| 33 |
| bb |
| BB |
| cc |
| CC |
+-------+
9 rows in set (0.00 sec)
[/sql]

prompt


有很多 MySQL 数据库管理,有时会发生自己忘记了在那台服务器的数据库上,使用 prompt 来重写mysql客户端提示符。
[sql]
mysql>prompt \u@\h(\d) \r:\m:\s>
[/sql]

  • \u 连接用户

  • \h 连接主机

  • \d 连接数据库

  • \r:\m:\s: 显示当前时间



有一一劳永逸的方法,就是在 my.cnf 中直接配置
[bash]
#不是[mysqld]
[mysql]
prompt=\\u@\\d \\R:\\m>
[/bash]

pager


如果 SELECT 出来的结果集超过几个屏幕,那么前面的结果无法看到。使用 pager 可以设置调用 os 的 more 或者 less 显示查询结果,和在 OS 中使用 more 或者 less 查看大文件的效果一样。
[sql]
mysql> pager more
PAGER set to 'more'
mysql> \P more
PAGER set to 'more'

mysql> pager less
PAGER set to 'less'
mysql> \P less
PAGER set to 'less'

mysql> nopager
PAGER set to stdout
[/sql]

DELIMITER


DELIMITER 就是告诉 MySQL 解释器,命令的结束符是什么。
默认情况下 MySQL 命令结束是以分号(;),在写过程或者函数等情况下,这会产生不少问题,因为存储过程中有许多语句,所以每一个都需要一个分号。因此你需要选择一个不太可能出现在你的语句或程序中的字符串作为分隔符。
[sql]
root@localhost(test) 03:27:17>DELIMITER $
root@localhost(test) 03:27:24>SELECT * FROM tbl_4$
+----+-------+
| id | title |
+----+-------+
| 1 | 11 |
| 2 | 22 |
| 3 | 33 |
| 4 | aa |
| 5 | bb |
| 6 | cc |
| 7 | AA |
| 8 | BB |
| 9 | CC |
+----+-------+
9 rows in set (0.00 sec)
[/sql]

LOAD DATA LOCAL INFILE


[bash]
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[/bash]

LOAD DATA INFILE and LOAD DATA LOCAL INFILE


在数据库中,LOAD DATA INFILE 和 LOAD DATA LOCAL INFILE都可以导入本地的数据,而 MySQL5.0 版本默认支持上述模式
[sql]
mysql> LOAD DATA INFILE ‘test.sql’ INTO TABLE test;
mysql> LOAD DATA LOCAL INFILE ‘test.sql’ INTO TABLE test;
[/sql]

启动mysql 加参数可限制使用 LOAD DATA LOCAL INFILE
[bash]
root@gguo-laptop:/usr/local/mysql/bin/mysqld_safe --local-infile=0 &
[/bash]
[sql]
mysql> LOAD DATA INFILE ‘test.sql’ INTO TABLE test;
[/sql]
ERROR 1148 (42000): The used command is not allowed with this MySQL version
而对于对于LOAD DATA INFILE, 可由user的 File_priv 对服务器主机上的文件访问进行控制

MySQL 提示符下运行应用程序


[bash]
mysql>\! cd /home
[/bash]