免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4094 | 回复: 10
打印 上一主题 下一主题

[C] Vim使用中的复杂问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-07 12:27 |只看该作者 |倒序浏览
请教下比如一段文本:
aaa bbb ccc ddd
     aaa bbb ccc ddd
          aaa bbb ccc ddd
如何使最后的ddd,能右对齐排列?  最终结果希望是
aaa bbb ccc           ddd
     aaa bbb ccc      ddd
          aaa bbb ccc ddd

如何才能做到,请vim高手指定! 万分感激
难点是如何使每行、在不同列上的ddd,移动不同的列后,最终保证所有的ddd右对齐。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2015-02-07 13:12 |只看该作者
这个。。。。好像不会啊。。。。。。。。。。。。。。。。
正则做不到噬。。。。

还是写个script吧。。。。。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2015-02-07 13:57 |只看该作者
执行这个程序吧!
  1. /* 将输入文件按每行的最后一个字右对齐 */

  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>

  6. int file_load(const char *filepath, char **o_buf, int *o_buf_len)
  7. {
  8.         FILE *fp;
  9.         char *buf;
  10.         int buf_len;
  11.         int retval;

  12.         retval = 0;
  13.         fp = fopen(filepath, "rb");
  14.         if (fp != NULL) {
  15.                 fseek(fp, 0, SEEK_END);
  16.                 buf_len = ftell(fp);
  17.                 buf = (char *)malloc(buf_len + 1);
  18.                 if (buf != NULL) {
  19.                         memset(buf, 0, buf_len + 1);
  20.                         fseek(fp, 0, SEEK_SET);
  21.                         if (fread(buf, buf_len, 1, fp) == 1) {
  22.                                 *o_buf = buf;
  23.                                 *o_buf_len = buf_len;
  24.                         }else {
  25.                                 retval = -3; /* ERROR: can't read file */
  26.                         }
  27.                         if (retval != 0) {
  28.                                 free(buf);
  29.                         }
  30.                 }else {
  31.                         retval = -2; /* ERROR: can't alloc memory */
  32.                 }
  33.                 fclose(fp);
  34.         }else {
  35.                 retval = -1; /* ERROR: can't open file */
  36.         }
  37.         return retval;
  38. }

  39. int nstr_chr(const char *s, int off, int lmt, int c)
  40. {
  41.         for (; off < lmt; ++off) {
  42.                 if (s[off] == c) {
  43.                         return off;
  44.                 }
  45.         }
  46.         return -1;
  47. }

  48. int nstr_trim(const char *s, int off, int lmt)
  49. {
  50.         for (; off < lmt; ++off) {
  51.                 if (!isspace(s[off])) {
  52.                         break;
  53.                 }
  54.         }
  55.         return off;
  56. }

  57. int nstr_rtrim(const char *s, int off, int lmt)
  58. {
  59.         for (; off < lmt; --lmt) {
  60.                 if (!isspace(s[lmt - 1])) {
  61.                         break;
  62.                 }
  63.         }
  64.         return lmt;
  65. }

  66. int nstr_rnpbrk(const char *s, int off, int lmt, const char *charset, int charset_len)
  67. {
  68.         for (; off < lmt; --lmt) {
  69.                 if (nstr_chr(charset, 0, charset_len, s[lmt - 1]) != -1) {
  70.                         break;
  71.                 }
  72.         }
  73.         return lmt;
  74. }

  75. int get_max_column(const char *s, int lmt)
  76. {
  77.         int off;
  78.         int line_lmt;
  79.         int line_nxt;
  80.         int column;
  81.         int line_columns;

  82.         column = 0;
  83.         for (off = 0; off < lmt; off = line_nxt) {
  84.                 line_lmt = nstr_chr(s, off, lmt, '\n');
  85.                 if (line_lmt == -1) {
  86.                         line_lmt = lmt;
  87.                         line_nxt = lmt;
  88.                 }else {
  89.                         line_nxt = line_lmt + 1;
  90.                 }
  91.                 line_lmt = nstr_rtrim(s, off, line_lmt);
  92.                 line_columns = line_lmt - off;
  93.                 if (line_columns > column) {
  94.                         column = line_columns;
  95.                 }
  96.         }
  97.         return column;
  98. }

  99. int main(int argc, const char *argv[])
  100. {
  101.         char *s;
  102.         int off;
  103.         int lmt;
  104.         int retval;
  105.         int line_lmt;
  106.         int line_nxt;
  107.         int columns;
  108.         int line_columns;
  109.         int last_word_off;
  110.         int insert_space;
  111.         const char *infile;

  112.         if (argc == 2) {
  113.                 infile = argv[1];
  114.         }else {
  115.                 infile = "sample\\data.txt";
  116.         }
  117.         printf("%s\n", infile);
  118.         retval = file_load(infile, &s, &lmt);
  119.         if (retval == 0) {
  120.                 columns = get_max_column(s, lmt);
  121.                 for (off = 0; off < lmt; off = line_nxt) {
  122.                         line_lmt = nstr_chr(s, off, lmt, '\n');
  123.                         if (line_lmt == -1) {
  124.                                 line_lmt = lmt;
  125.                                 line_nxt = lmt;
  126.                         }else {
  127.                                 line_nxt = line_lmt + 1;
  128.                         }
  129.                         line_lmt = nstr_rtrim(s, off, line_lmt);
  130.                         line_columns = line_lmt - off;
  131.                         if (line_columns < columns) {
  132.                                 last_word_off = nstr_rnpbrk(s, off, line_lmt, " \t", 2);
  133.                                 printf("%.*s", last_word_off - off, s + off);
  134.                                 insert_space = columns - line_columns;
  135.                                 printf("%*c", insert_space, ' ');
  136.                                 printf("%.*s\n", line_lmt - last_word_off, s + last_word_off);
  137.                         }else {
  138.                                 printf("%.*s\n", line_lmt - off, s + off);
  139.                         }
  140.                 }
  141.                 free(s);
  142.         }
  143.         return retval;
  144. }
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-02-07 21:10 |只看该作者
回复 3# cobras


    从你贴出的这个代码就能看出掌握一门脚本语言是非常必要的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2015-02-08 16:33 |只看该作者
这里面有个技巧。
不知道楼主的 ddd 有没有规律,或者说没有规律只要保证是最后一个字段也行。

然后这样搞一下:
:%s/\s\+\(\S\+\)$/\t\1/
:set ts=80      <----- 这里的 80 可以根据需要自己调整,这里可以反复调整,不影响效果。
:set et
:retab

其中 :set et 是我 vimrc 里的设置,所以对我来说我可以少输入一条命令。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
6 [报告]
发表于 2015-02-11 15:28 |只看该作者
好方法,手工点赞。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
7 [报告]
发表于 2015-03-06 11:30 |只看该作者
不知道你的是否支持这种方法:shift+v选中文本 ,J K 上下移动,然后=符号对齐。

论坛徽章:
0
8 [报告]
发表于 2015-04-11 22:46 |只看该作者
回复 5# flw


这是目前看到的,最完美的解决办法了,非常感谢!

   

论坛徽章:
0
9 [报告]
发表于 2015-04-11 22:47 |只看该作者
flw 发表于 2015-02-08 16:33
这里面有个技巧。
不知道楼主的 ddd 有没有规律,或者说没有规律只要保证是最后一个字段也行。


非常好,很感谢!困扰了很长很长时间...

论坛徽章:
0
10 [报告]
发表于 2015-04-14 17:00 |只看该作者
回复 1# szluojianqi
使用寄存器可以做到

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP