set nu

vimのnumberモードはファイルチェックなんかするときに結構便利。けど、たとえば仕事で長大なるテストパターンなんかをチェックするときなんかに

  :
  :
 1384             cmp_memdata32(32'h40800500 , 32'h78787878 ); 
 1385             cmp_memdata32(32'h40800504 , 32'h78787878 ); 
 1386             cmp_memdata32(32'h40800508 , 32'h78787878 ); 
 1387             cmp_memdata32(32'h4080050C , 32'h78787878 ); 
 1388             cmp_memdata32(32'h40800510 , 32'h78787878 ); 
 1389             cmp_memdata32(32'h40800514 , 32'h78787878 ); 
 1390             cmp_memdata32(32'h40800518 , 32'h78787878 ); 
 1391             cmp_memdata32(32'h4080051C , 32'h78787878 ); 
 1392             cmp_memdata32(32'h40800520 , 32'h78787878 ); 
 1393             cmp_memdata32(32'h40800524 , 32'h78787878 ); 
  :
  :

脳がふやけてくると何ピクセル目か数える力が失われる。引き算力限りなく0.nuに数えてほしい=32h'40800500の行を 1として読み直したい。ggd1383Gしてもいいんだけど、流石にそれは、、、というときに一時的に変更する方法ないのかな、とか悩む。

直接変えちゃえ

脳がそもそもふやけているので強引なことをし始める。

diff -ca ../../vim71/src/option.c ./option.c
*** ../../vim71/src/option.c	2007-05-01 20:26:10.000000000 +0900
--- ./option.c	2008-12-19 17:14:50.000000000 +0900
***************
*** 1718,1723 ****
--- 1718,1726 ----
      {"modelines",   "mls",  P_NUM|P_VI_DEF,
  			    (char_u *)&p_mls, PV_NONE,
  			    {(char_u *)5L, (char_u *)0L}},
+     {"disptop",     "dts",  P_NUM|P_VI_DEF,
+ 			    (char_u *)&p_dts, PV_NONE,
+ 			    {(char_u *)1L, (char_u *)1L}},
      {"modifiable",  "ma",   P_BOOL|P_VI_DEF|P_NOGLOB,
  			    (char_u *)&p_ma, PV_MA,
  			    {(char_u *)TRUE, (char_u *)0L}},
diff -ca ../../vim71/src/option.h ./option.h
*** ../../vim71/src/option.h	2007-05-08 04:23:03.000000000 +0900
--- ./option.h	2008-12-19 16:16:17.000000000 +0900
***************
*** 607,612 ****
--- 607,613 ----
  EXTERN char_u	*p_msm;		/* 'mkspellmem' */
  #endif
  EXTERN long	p_mls;		/* 'modelines' */
+ EXTERN long	p_dts;		/* 'disptop' */
  EXTERN char_u	*p_mouse;	/* 'mouse' */
  #ifdef FEAT_GUI
  EXTERN int	p_mousef;	/* 'mousefocus' */
共通の下位ディレクトリー: ../../vim71/src/protoと./proto
diff -ca ../../vim71/src/screen.c ./screen.c
*** ../../vim71/src/screen.c	2007-05-08 04:27:53.000000000 +0900
--- ./screen.c	2008-12-19 16:41:58.000000000 +0900
***************
*** 88,93 ****
--- 88,95 ----
  
  #include "vim.h"
  
+ extern long p_dts;
+ 
  /*
   * The attributes that are actually active for writing to the screen.
   */
***************
*** 3263,3270 ****
  #endif
  			    )
  		    {
! 			sprintf((char *)extra, "%*ld ",
! 						number_width(wp), (long)lnum);
  			if (wp->w_skipcol > 0)
  			    for (p_extra = extra; *p_extra == ' '; ++p_extra)
  				*p_extra = '-';
--- 3265,3275 ----
  #endif
  			    )
  		    {
! 			if (lnum - p_dts+1 >0) {
! 			    sprintf((char *)extra, "%*ld ", number_width(wp), (long)lnum-p_dts+1);
! 			} else {
! 			    sprintf((char *)extra, "%*s ", number_width(wp), "");
! 			}
  			if (wp->w_skipcol > 0)
  			    for (p_extra = extra; *p_extra == ' '; ++p_extra)
  				*p_extra = '-';

おお、一発で動いた・・・
これを gtとかにマップしてみる。

command! SetDisptop :call <SID>Setdisptop()

nnoremap gt :SetDisptop<CR>

function! s:Setdisptop()
  let lnum= line('.')
  let com = 'set disptop='.lnum
  exe(com)
  redraw!
endfunction

どれどれ、、、gtと。

よっしゃ。

すごく

馬鹿なことしてる気がする。
きっともっと簡単な方法が・・・

追記:マイナスも表示したほうが便利だったりして。。。