スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Vim:行数と文字との間を空白文字以外にしたい(option化)

一番考えやすい方法で実装することにしました。
global以外は時間があったときにためそうかなと。
というか誰かpatch化して、機能追加してくれるとありがたい

方法ですが、tkuro11さんを見習って書きますと、
option.cにあるコメントより
/*
(-) * Code to handle user-settable options. This is all pretty much table-
(-) * driven. Checklist for adding a new option:
(-) * - Put it in the options array below (copy an existing entry).
(+) * - For a global option: Add a variable for it in option.h.
(-) * - For a buffer or window local option:
(-) * - Add a PV_XX entry to the enum below.
(-) * - Add a variable to the window or buffer struct in structs.h.
(-) * - For a window option, add some code to copy_winopt().
(-) * - For a buffer option, add some code to buf_copy_options().
(-) * - For a buffer string option, add code to check_buf_options().
(-) * - If it's a numeric option, add any necessary bounds checks to do_set().
(+) * - If it's a list of flags, add some code in do_set(), search for WW_ALL.
(-) * - When adding an option with expansion (P_EXPAND), but with a different
(-) * default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
(-) * - Add documentation! One line in doc/help.txt, full description in
(-) * options.txt, and any other related places.
(-) * - Add an entry in runtime/optwin.vim.
(-) * When making changes:
(-) * - Adjust the help for the option in doc/option.txt.
(-) * - When an entry has the P_VIM flag, or is lacking the P_VI_DEF flag, add a
(-) * comment at the help for the 'compatible' option.
*/
の(+)部分をやりました。
たぶん、globalじゃなくても出来ると思ってますが
Vim力が足りないので、これからがんばります。

仕様はこんな感じです。
機能:行数と本文の間の空白文字を特定の指定文字にする。
変数:numberchar(default:" "(半角空白))
指定文字:" ^*><#(){}[]:/'%$.,\\|"
注意事項:" "(半角空白)や"|"や"'"は別の意味を持つので、前に「\」をつけます。

option.h


ここでは、global変数の宣言と指定文字の制限を記述しています。





src/option.horg/src/option.h


   1|+--172 行:vi:set ts=8 sts=4 sw=4:
 173|                                 * cursor would not move */
 174|/* default values for Vim, Vi and POSIX */
 175|#define CPO_VIM         "aABceFs"
 176|#define CPO_VI          "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>;"
 177|#define CPO_ALL         "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>#{|&/\\.;"
 178|
 179|/* characters for p_nuchr option: */
 180|#define NUCHR_ALL       " ^*<>#(){}[]:/'%$.,\\|"
 181|
 182|/* characters for p_ww option: */
 183|#define WW_ALL          "bshl<>[],~"
 184|
 185|/* characters for p_mouse option: */
 186|#define MOUSE_NORMAL    'n'             /* use mouse in Normal mode */
 187|#define MOUSE_VISUAL    'v'             /* use mouse in Visual/Select mode */
 188|+--443 行:#define MOUSE_INSERT 'i'  use mouse in Insert mode 
 631|EXTERN char_u   *p_mousem;      /* 'mousemodel' */
 632|EXTERN long     p_mouset;       /* 'mousetime' */
 633|EXTERN int      p_more;         /* 'more' */
 634|#ifdef FEAT_MZSCHEME
 635|EXTERN long     p_mzq;          /* 'mzquantum */
 636|#endif
 637|EXTERN char_u   *p_nuchr;       /* 'numberchar */
 638|#if defined(MSDOS) || defined(MSWIN) || defined(OS2)
 639|EXTERN int      p_odev;         /* 'opendevice' */
 640|#endif
 641|EXTERN char_u   *p_opfunc;      /* 'operatorfunc' */
 642|EXTERN char_u   *p_para;        /* 'paragraphs' */
 643|EXTERN int      p_paste;        /* 'paste' */
 644|+--464 行:EXTERN char_u *p_pt;  'pastetoggle' 



   1|+--172 行:vi:set ts=8 sts=4 sw=4:
 173|                                 * cursor would not move */
 174|/* default values for Vim, Vi and POSIX */
 175|#define CPO_VIM         "aABceFs"
 176|#define CPO_VI          "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>;"
 177|#define CPO_ALL         "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>#{|&/\\.;"
 178|
     ------
     ------
     ------
 179|/* characters for p_ww option: */
 180|#define WW_ALL          "bshl<>[],~"
 181|
 182|/* characters for p_mouse option: */
 183|#define MOUSE_NORMAL    'n'             /* use mouse in Normal mode */
 184|#define MOUSE_VISUAL    'v'             /* use mouse in Visual/Select mode */
 185|+--443 行:#define MOUSE_INSERT 'i'  use mouse in Insert mode 
 628|EXTERN char_u   *p_mousem;      /* 'mousemodel' */
 629|EXTERN long     p_mouset;       /* 'mousetime' */
 630|EXTERN int      p_more;         /* 'more' */
 631|#ifdef FEAT_MZSCHEME
 632|EXTERN long     p_mzq;          /* 'mzquantum */
 633|#endif
     ------
 634|#if defined(MSDOS) || defined(MSWIN) || defined(OS2)
 635|EXTERN int      p_odev;         /* 'opendevice' */
 636|#endif
 637|EXTERN char_u   *p_opfunc;      /* 'operatorfunc' */
 638|EXTERN char_u   *p_para;        /* 'paragraphs' */
 639|EXTERN int      p_paste;        /* 'paste' */
 640|+--464 行:EXTERN char_u *p_pt;  'pastetoggle' 

option.c


ここでは、実際に定義した変数の扱いを記述しています。





src/option.corg/src/option.c


    1|+--1864 行:vi:set ts=8 sts=4 sw=4:
 1865|                            (char_u *)&p_nf, PV_NF,
 1866|                            {(char_u *)"octal,hex", (char_u *)0L}
 1867|                            SCRIPTID_INIT},
 1868|    {"number",      "nu",   P_BOOL|P_VI_DEF|P_RWIN,
 1869|                            (char_u *)VAR_WIN, PV_NU,
 1870|                            {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
 1871|    {"numberchar",  "nuchr",P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_FLAGLIST,
 1872|                            (char_u *)&p_nuchr, PV_NONE,
 1873|                            {(char_u *)" ", (char_u *)" "} SCRIPTID_INIT},
 1874|    {"numberwidth""nuw",  P_NUM|P_RWIN|P_VIM,
 1875|#ifdef FEAT_LINEBREAK
 1876|                            (char_u *)VAR_WIN, PV_NUW,
 1877|#else
 1878|                            (char_u *)NULL, PV_NONE,
 1879|#endif
 1880|+--5006 行:{(char_u *)8L, (char_u *)4L} SCRIPTID_INIT},
 6886|#endif
 6887|
 6888|    /* Options that are a list of flags. */
 6889|    else
 6890|    {
 6891|        p = NULL;
 6892|        if (gvarp == &p_nuchr)
 6893|            p = (char_u *)NUCHR_ALL;
 6894|        if (varp == &p_ww)
 6895|            p = (char_u *)WW_ALL;
 6896|        if (varp == &p_shm)
 6897|            p = (char_u *)SHM_ALL;
 6898|        else if (varp == &(p_cpo))
 6899|            p = (char_u *)CPO_ALL;
 6900|+--4497 行:else if (varp == &(curbuf->b_p_fo))



    1|+--1864 行:vi:set ts=8 sts=4 sw=4:
 1865|                            (char_u *)&p_nf, PV_NF,
 1866|                            {(char_u *)"octal,hex", (char_u *)0L}
 1867|                            SCRIPTID_INIT},
 1868|    {"number",      "nu",   P_BOOL|P_VI_DEF|P_RWIN,
 1869|                            (char_u *)VAR_WIN, PV_NU,
 1870|                            {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
      ------
      ------
      ------
 1871|    {"numberwidth""nuw",  P_NUM|P_RWIN|P_VIM,
 1872|#ifdef FEAT_LINEBREAK
 1873|                            (char_u *)VAR_WIN, PV_NUW,
 1874|#else
 1875|                            (char_u *)NULL, PV_NONE,
 1876|#endif
 1877|+--5006 行:{(char_u *)8L, (char_u *)4L} SCRIPTID_INIT},
 6883|#endif
 6884|
 6885|    /* Options that are a list of flags. */
 6886|    else
 6887|    {
 6888|        p = NULL;
      ------
      ------
 6889|        if (varp == &p_ww)
 6890|            p = (char_u *)WW_ALL;
 6891|        if (varp == &p_shm)
 6892|            p = (char_u *)SHM_ALL;
 6893|        else if (varp == &(p_cpo))
 6894|            p = (char_u *)CPO_ALL;
 6895|+--4497 行:else if (varp == &(curbuf->b_p_fo))

screen.c


表示部分に対して、定義したglbal変数を使用して表示させています。





src/screen.corg/src/screen.c


    1|+--2319 行:vi:set ts=8 sts=4 sw=4:
 2320|                /* 'number' */
 2321|                num = (long)lnum;
 2322|            else
 2323|                /* 'relativenumber', don't use negative numbers */
 2324|                num = labs((long)get_cursor_rel_lnum(wp, lnum));
 2325|
 2326|            sprintf((char *)buf, "%*ld%s", w, num, p_nuchr);
 2327|#ifdef FEAT_RIGHTLEFT
 2328|            if (wp->w_p_rl)
 2329|                /* the line number isn't reversed */
 2330|                copy_text_attr(off + W_WIDTH(wp) - len - col, buf, len,
 2331|                                                             hl_attr(HLF_FL));
 2332|            else
 2333|+--1147 行:#endif
 3480|                            /* 'number' */
 3481|                            num = (long)lnum;
 3482|                        else
 3483|                            /* 'relativenumber', don't use negative numbers */
 3484|                            num = labs((long)get_cursor_rel_lnum(wp, lnum));
 3485|
 3486|                        sprintf((char *)extra, "%*ld%s",
 3487|                                                number_width(wp), num, p_nuchr);
 3488|                        if (wp->w_skipcol > 0)
 3489|                            for (p_extra = extra; *p_extra == ' '; ++p_extra)
 3490|                                *p_extra = '-';
 3491|#ifdef FEAT_RIGHTLEFT
 3492|                        if (wp->w_p_rl)             /* reverse line numbers */
 3493|                            rl_mirror(extra);
 3494|+--6732 行:#endif



    1|+--2319 行:vi:set ts=8 sts=4 sw=4:
 2320|                /* 'number' */
 2321|                num = (long)lnum;
 2322|            else
 2323|                /* 'relativenumber', don't use negative numbers */
 2324|                num = labs((long)get_cursor_rel_lnum(wp, lnum));
 2325|
 2326|            sprintf((char *)buf, "%*ld ", w, num);
 2327|#ifdef FEAT_RIGHTLEFT
 2328|            if (wp->w_p_rl)
 2329|                /* the line number isn't reversed */
 2330|                copy_text_attr(off + W_WIDTH(wp) - len - col, buf, len,
 2331|                                                             hl_attr(HLF_FL));
 2332|            else
 2333|+--1147 行:#endif
 3480|                            /* 'number' */
 3481|                            num = (long)lnum;
 3482|                        else
 3483|                            /* 'relativenumber', don't use negative numbers */
 3484|                            num = labs((long)get_cursor_rel_lnum(wp, lnum));
 3485|
 3486|                        sprintf((char *)extra, "%*ld ",
 3487|                                                number_width(wp), num);
 3488|                        if (wp->w_skipcol > 0)
 3489|                            for (p_extra = extra; *p_extra == ' '; ++p_extra)
 3490|                                *p_extra = '-';
 3491|#ifdef FEAT_RIGHTLEFT
 3492|                        if (wp->w_p_rl)             /* reverse line numbers */
 3493|                            rl_mirror(extra);
 3494|+--6732 行:#endif
というような感じで、出来上がりました。
あれ?なんで、diff部分はWeb表示がおかしいんだろう???
Blog見づらくてすいません。

上記のソースは「vim-numberchar(Github)」にあります。
何かあればご指摘お願いします。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。