vim-jp/issues — Issue #101: getcharmod()がDictionaryを返してくれるとうれしい
Author: tyru
Created: 2011-12-01 14:04:12+00:00
State: open

こんな具合にDictionaryを返してくれるとうれしいと思ったのでパッチ書きました。
経過を日本語で残しておきたいのでissues利用させてもらいます。

該当スレッド:

diff -r 9abd62fd9e3a runtime/doc/eval.txt
--- a/runtime/doc/eval.txt	Wed Nov 30 17:20:23 2011 +0100
+++ b/runtime/doc/eval.txt	Thu Dec 01 22:26:49 2011 +0900
@@ -1773,7 +1773,7 @@
List	lines {lnum} to {end} of buffer {expr}
getbufvar( {expr}, {varname})	any	variable {varname} in buffer {expr}
getchar( [expr])	Number	get one character from the user
-getcharmod( )	Number	modifiers for the last typed character
+getcharmod( [{dict}])	Number	modifiers for the last typed character
getcmdline()	String	return the current command-line
getcmdpos()	Number	return cursor position in command-line
getcmdtype()	String	return the current command-line type
@@ -3182,7 +3182,7 @@
: endwhile
:endfunction

-getcharmod()	*getcharmod()*
+getcharmod([{dict}])	*getcharmod()*
The result is a Number which is the state of the modifiers for
the last obtained character with getchar() or in another way.
These values are added together:
@@ -3197,6 +3197,17 @@
character itself are obtained.	Thus Shift-a results in "A"
without a modifier.

+	When {dict} is there and it is non-zero return a dictionary
+	containing all the information of the mapping with the
+	following items:
+	"shift"	1 if shift-key pressed, else 0.
+	"ctrl"	1 if ctrl-key pressed, else 0.
+	"alt"	1 if alt-key pressed, else 0.
+	"mousedouble"	1 if mouse clicked twice, else 0.
+	"mousetriple"	1 if mouse clicked thrice, else 0.
+	"mousequad"	1 if mouse clicked quater, else 0.
+	"command"	1 if command-key pressed, else 0.
+
getcmdline()	*getcmdline()*
Return the current command-line. Only works when the command
line is being edited, thus requires use of |c_CTRL-\_e| or
diff -r 9abd62fd9e3a src/eval.c
--- a/src/eval.c	Wed Nov 30 17:20:23 2011 +0100
+++ b/src/eval.c	Thu Dec 01 22:26:49 2011 +0900
@@ -7802,7 +7802,7 @@
{"getbufline",	2, 3, f_getbufline},
{"getbufvar",	2, 2, f_getbufvar},
{"getchar",	0, 1, f_getchar},
- {"getcharmod",	0, 0, f_getcharmod},
+ {"getcharmod",	0, 1, f_getcharmod},
{"getcmdline",	0, 0, f_getcmdline},
{"getcmdpos",	0, 0, f_getcmdpos},
{"getcmdtype",	0, 0, f_getcmdtype},
@@ -11063,10 +11063,35 @@
*/
static void
f_getcharmod(argvars, rettv)
- typval_T	*argvars UNUSED;
- typval_T	*rettv;
-{
- rettv->vval.v_number = mod_mask;
+ typval_T	*argvars;
+ typval_T	*rettv;
+{
+ int dict = FALSE;
+ if (argvars[0].v_type == VAR_NUMBER)
+ {
+	int error = FALSE;
+	dict = get_tv_number_chk(&argvars[0], &error);
+	if (error)
+	return;
+ }
+ if (dict)
+ {
+	dict_T *dict;
+	if (rettv_dict_alloc(rettv) == FAIL)
+	return;
+	dict = rettv->vval.v_dict;
+	dict_add_nr_str(dict, "shift", mod_mask & 2, NULL);
+	dict_add_nr_str(dict, "ctrl", mod_mask & 4, NULL);
+	dict_add_nr_str(dict, "alt", mod_mask & 8, NULL);
+	dict_add_nr_str(dict, "mousedouble", mod_mask & 16, NULL);
+	dict_add_nr_str(dict, "mousetriple", mod_mask & 32, NULL);
+	dict_add_nr_str(dict, "mousequad", mod_mask & 64, NULL);
+	dict_add_nr_str(dict, "command", mod_mask & 128, NULL);
+ }
+ else
+ {
+	rettv->vval.v_number = mod_mask;
+ }
}

/*