mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
updated for version 7.0150
This commit is contained in:
parent
1e01546026
commit
4463f296d0
41
runtime/compiler/rubyunit.vim
Normal file
41
runtime/compiler/rubyunit.vim
Normal file
@ -0,0 +1,41 @@
|
||||
" Vim compiler file
|
||||
" Language: Test::Unit - Ruby Unit Testing Framework
|
||||
" Maintainer: Doug Kearns <djkea2 at gus.gscit.monash.edu.au>
|
||||
" Info: $Id$
|
||||
" URL: http://vim-ruby.sourceforge.net
|
||||
" Anon CVS: See above site
|
||||
" Licence: GPL (http://www.gnu.org)
|
||||
" Disclaimer:
|
||||
" This program is distributed in the hope that it will be useful,
|
||||
" but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
" GNU General Public License for more details.
|
||||
" ----------------------------------------------------------------------------
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
endif
|
||||
let current_compiler = "rubyunit"
|
||||
|
||||
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
|
||||
command -nargs=* CompilerSet setlocal <args>
|
||||
endif
|
||||
|
||||
let s:cpo_save = &cpo
|
||||
set cpo-=C
|
||||
|
||||
CompilerSet makeprg=testrb
|
||||
|
||||
CompilerSet errorformat=\%W\ %\\+%\\d%\\+)\ Failure:,
|
||||
\%C%m\ [%f:%l]:,
|
||||
\%E\ %\\+%\\d%\\+)\ Error:,
|
||||
\%C%m:,
|
||||
\%C\ \ \ \ %f:%l:%.%#,
|
||||
\%C%m,
|
||||
\%Z\ %#,
|
||||
\%-G%.%#
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8 ff=unix:
|
@ -1,4 +1,4 @@
|
||||
*todo.txt* For Vim version 7.0aa. Last change: 2005 Sep 20
|
||||
*todo.txt* For Vim version 7.0aa. Last change: 2005 Sep 25
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -30,21 +30,19 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
|
||||
*known-bugs*
|
||||
-------------------- Known bugs and current work -----------------------
|
||||
|
||||
Test11 fails sometimes. (athena, huge features)
|
||||
|
||||
ml_get errors: :%s/^\_s\+$//gc
|
||||
And: Insert mode in one window, long file, click in other window, short file.
|
||||
|
||||
'scrolljump' negative used as a percentage, e.g. -50 is 50% of window height?
|
||||
|
||||
Spelling:
|
||||
- suggestion for "a an" includes "an an", which is marked bad. Check
|
||||
suggestions for not being a bad word (when split)?
|
||||
- Suggestions for "the the" includes "thee the" but not "the thee"?
|
||||
- CTRL-X s doesn't consider 'spellcapcheck'.
|
||||
- Have spellbadword() return a list with bad word and reason it's bad?
|
||||
(rare/local/bad/caps)
|
||||
- Spellbadword() returns a list with bad word and reason it's bad.
|
||||
This doesn't work when highlighting is the same for some mistakes.
|
||||
- spellsuggest() needs a way to require a capital. A flag or context?
|
||||
- Underscore in REP items stands for space.
|
||||
|
||||
Win32: Composing char appears on next position. (Tony Mechelynck)
|
||||
|
||||
Support subdirectories in plugin directory? (Nikolai Weibull)
|
||||
|
||||
Change 'include' so that it can match the file name when \zs and \ze are
|
||||
included. (docs already done tentatively).
|
||||
|
||||
ccomplete:
|
||||
- How to use a popup menu?
|
||||
@ -594,8 +592,7 @@ Win32 GUI known bugs:
|
||||
Opposite of 'linespace': 'columnspace'.
|
||||
7 At the hit-enter prompt scrolling now no longer works. Need to use the
|
||||
keyboard to get around this. Pretend <CR> was hit when the user tries to
|
||||
scroll? Need to be able to get out of hit-enter prompt with the mouse
|
||||
anyway.
|
||||
scroll?
|
||||
7 Scrollbar width doesn't change when selecting other windows appearance.
|
||||
Also background color of Toolbar and rectangle below vert. scrollbar.
|
||||
7 "!start /min cmd" should run in a minimized window, instead of using
|
||||
|
@ -1,4 +1,4 @@
|
||||
*version7.txt* For Vim version 7.0aa. Last change: 2005 Sep 15
|
||||
*version7.txt* For Vim version 7.0aa. Last change: 2005 Sep 23
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -600,6 +600,9 @@ When 'verbose' is set the output of the ":map", ":abbreviate", ":command",
|
||||
"1gd" can be used like "gd" but ignores matches in a {} block that ends before
|
||||
the cursor position. Likewise for "1gD" and "gD".
|
||||
|
||||
'scrolljump' can be set to a negative number to scroll a percentage of the
|
||||
window height.
|
||||
|
||||
==============================================================================
|
||||
IMPROVEMENTS *improvements-7*
|
||||
|
||||
@ -817,6 +820,9 @@ closing a fold with the mouse by clicking on the '-'.
|
||||
input() takes an optional completion argument to specify the type of
|
||||
completion supported for the input. (Yegappan Lakshmanan)
|
||||
|
||||
"dp" works with more than two buffers in diff mode if there is only one where
|
||||
'modifiable' is set.
|
||||
|
||||
==============================================================================
|
||||
COMPILE TIME CHANGES *compile-changes-7*
|
||||
|
||||
|
@ -195,7 +195,7 @@
|
||||
+ REP an_a a
|
||||
+ REP a_an an
|
||||
*** en_US.orig.dic Fri Apr 15 13:20:36 2005
|
||||
--- en_US.dic Tue Aug 16 17:03:31 2005
|
||||
--- en_US.dic Wed Sep 21 11:36:06 2005
|
||||
***************
|
||||
*** 5944,5946 ****
|
||||
bk
|
||||
@ -565,12 +565,16 @@
|
||||
Zubenelgenubi/M
|
||||
***************
|
||||
*** 62077 ****
|
||||
--- 62077,62084 ----
|
||||
--- 62077,62088 ----
|
||||
zymurgy/S
|
||||
+ nd
|
||||
+ the the/!
|
||||
+ a a/!
|
||||
+ an an/!
|
||||
+ a an/!
|
||||
+ an a/!
|
||||
+ an an/!
|
||||
+ the a/!
|
||||
+ the an/!
|
||||
+ a the/!
|
||||
+ an the/!
|
||||
+ PayPal
|
||||
|
159
src/eval.c
159
src/eval.c
@ -409,7 +409,8 @@ static listitem_T *list_find __ARGS((list_T *l, long n));
|
||||
static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
|
||||
static void list_append __ARGS((list_T *l, listitem_T *item));
|
||||
static int list_append_tv __ARGS((list_T *l, typval_T *tv));
|
||||
static int list_append_string __ARGS((list_T *l, char_u *str));
|
||||
static int list_append_string __ARGS((list_T *l, char_u *str, int len));
|
||||
static int list_append_number __ARGS((list_T *l, varnumber_T n));
|
||||
static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
|
||||
static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
|
||||
static int list_concat __ARGS((list_T *l1, list_T *l2, typval_T *tv));
|
||||
@ -2551,7 +2552,6 @@ set_var_lval(lp, endp, rettv, copy, op)
|
||||
char_u *op;
|
||||
{
|
||||
int cc;
|
||||
listitem_T *ni;
|
||||
listitem_T *ri;
|
||||
dictitem_T *di;
|
||||
|
||||
@ -2603,16 +2603,11 @@ set_var_lval(lp, endp, rettv, copy, op)
|
||||
if (lp->ll_li->li_next == NULL)
|
||||
{
|
||||
/* Need to add an empty item. */
|
||||
ni = listitem_alloc();
|
||||
if (ni == NULL)
|
||||
if (list_append_number(lp->ll_list, 0) == FAIL)
|
||||
{
|
||||
ri = NULL;
|
||||
break;
|
||||
}
|
||||
ni->li_tv.v_type = VAR_NUMBER;
|
||||
ni->li_tv.v_lock = 0;
|
||||
ni->li_tv.vval.v_number = 0;
|
||||
list_append(lp->ll_list, ni);
|
||||
}
|
||||
lp->ll_li = lp->ll_li->li_next;
|
||||
++lp->ll_n1;
|
||||
@ -3598,6 +3593,7 @@ typedef enum
|
||||
* Handle zero level expression.
|
||||
* This calls eval1() and handles error message and nextcmd.
|
||||
* Put the result in "rettv" when returning OK and "evaluate" is TRUE.
|
||||
* Note: "rettv.v_lock" is not set.
|
||||
* Return OK or FAIL.
|
||||
*/
|
||||
static int
|
||||
@ -3638,6 +3634,8 @@ eval0(arg, rettv, nextcmd, evaluate)
|
||||
* "arg" must point to the first non-white of the expression.
|
||||
* "arg" is advanced to the next non-white after the recognized expression.
|
||||
*
|
||||
* Note: "rettv.v_lock" is not set.
|
||||
*
|
||||
* Return OK or FAIL.
|
||||
*/
|
||||
static int
|
||||
@ -5557,12 +5555,14 @@ list_append_dict(list, dict)
|
||||
|
||||
/*
|
||||
* Make a copy of "str" and append it as an item to list "l".
|
||||
* When "len" >= 0 use "str[len]".
|
||||
* Returns FAIL when out of memory.
|
||||
*/
|
||||
static int
|
||||
list_append_string(l, str)
|
||||
list_append_string(l, str, len)
|
||||
list_T *l;
|
||||
char_u *str;
|
||||
int len;
|
||||
{
|
||||
listitem_T *li = listitem_alloc();
|
||||
|
||||
@ -5571,11 +5571,33 @@ list_append_string(l, str)
|
||||
list_append(l, li);
|
||||
li->li_tv.v_type = VAR_STRING;
|
||||
li->li_tv.v_lock = 0;
|
||||
if ((li->li_tv.vval.v_string = vim_strsave(str)) == NULL)
|
||||
if ((li->li_tv.vval.v_string = len >= 0 ? vim_strnsave(str, len)
|
||||
: vim_strsave(str)) == NULL)
|
||||
return FAIL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Append "n" to list "l".
|
||||
* Returns FAIL when out of memory.
|
||||
*/
|
||||
static int
|
||||
list_append_number(l, n)
|
||||
list_T *l;
|
||||
varnumber_T n;
|
||||
{
|
||||
listitem_T *li;
|
||||
|
||||
li = listitem_alloc();
|
||||
if (li == NULL)
|
||||
return FAIL;
|
||||
li->li_tv.v_type = VAR_NUMBER;
|
||||
li->li_tv.v_lock = 0;
|
||||
li->li_tv.vval.v_number = n;
|
||||
list_append(l, li);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert typval_T "tv" in list "l" before "item".
|
||||
* If "item" is NULL append at the end.
|
||||
@ -6864,7 +6886,7 @@ static struct fst
|
||||
{"simplify", 1, 1, f_simplify},
|
||||
{"sort", 1, 2, f_sort},
|
||||
{"soundfold", 1, 1, f_soundfold},
|
||||
{"spellbadword", 0, 0, f_spellbadword},
|
||||
{"spellbadword", 0, 1, f_spellbadword},
|
||||
{"spellsuggest", 1, 2, f_spellsuggest},
|
||||
{"split", 1, 3, f_split},
|
||||
#ifdef HAVE_STRFTIME
|
||||
@ -8842,6 +8864,7 @@ filter_map_one(tv, expr, map, remp)
|
||||
{
|
||||
/* map(): replace the list item value */
|
||||
clear_tv(tv);
|
||||
rettv.v_lock = 0;
|
||||
*tv = rettv;
|
||||
}
|
||||
else
|
||||
@ -9261,7 +9284,8 @@ get_buffer_lines(buf, start, end, retlist, rettv)
|
||||
if (end > buf->b_ml.ml_line_count)
|
||||
end = buf->b_ml.ml_line_count;
|
||||
while (start <= end)
|
||||
if (list_append_string(l, ml_get_buf(buf, start++, FALSE)) == FAIL)
|
||||
if (list_append_string(l, ml_get_buf(buf, start++, FALSE), -1)
|
||||
== FAIL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -10855,25 +10879,25 @@ f_input(argvars, rettv)
|
||||
defstr = get_tv_string_buf_chk(&argvars[1], buf);
|
||||
if (defstr != NULL)
|
||||
stuffReadbuffSpec(defstr);
|
||||
}
|
||||
|
||||
if (argvars[2].v_type != VAR_UNKNOWN)
|
||||
{
|
||||
char_u *xp_name;
|
||||
int xp_namelen;
|
||||
long argt;
|
||||
if (argvars[2].v_type != VAR_UNKNOWN)
|
||||
{
|
||||
char_u *xp_name;
|
||||
int xp_namelen;
|
||||
long argt;
|
||||
|
||||
rettv->vval.v_string = NULL;
|
||||
rettv->vval.v_string = NULL;
|
||||
|
||||
xp_name = get_tv_string_buf_chk(&argvars[2], buf);
|
||||
if (xp_name == NULL)
|
||||
return;
|
||||
xp_name = get_tv_string_buf_chk(&argvars[2], buf);
|
||||
if (xp_name == NULL)
|
||||
return;
|
||||
|
||||
xp_namelen = STRLEN(xp_name);
|
||||
xp_namelen = STRLEN(xp_name);
|
||||
|
||||
if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt, &xp_arg)
|
||||
== FAIL)
|
||||
return;
|
||||
if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt,
|
||||
&xp_arg) == FAIL)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (defstr != NULL)
|
||||
@ -11713,14 +11737,11 @@ find_some_match(argvars, rettv, type)
|
||||
{
|
||||
if (regmatch.endp[i] == NULL)
|
||||
break;
|
||||
li = listitem_alloc();
|
||||
if (li == NULL)
|
||||
if (list_append_string(rettv->vval.v_list,
|
||||
regmatch.startp[i],
|
||||
(int)(regmatch.endp[i] - regmatch.startp[i]))
|
||||
== FAIL)
|
||||
break;
|
||||
li->li_tv.v_type = VAR_STRING;
|
||||
li->li_tv.v_lock = 0;
|
||||
li->li_tv.vval.v_string = vim_strnsave(regmatch.startp[i],
|
||||
(int)(regmatch.endp[i] - regmatch.startp[i]));
|
||||
list_append(rettv->vval.v_list, li);
|
||||
}
|
||||
}
|
||||
else if (type == 2)
|
||||
@ -12112,7 +12133,6 @@ f_range(argvars, rettv)
|
||||
long stride = 1;
|
||||
long i;
|
||||
list_T *l;
|
||||
listitem_T *li;
|
||||
int error = FALSE;
|
||||
|
||||
start = get_tv_number_chk(&argvars[0], &error);
|
||||
@ -12145,15 +12165,8 @@ f_range(argvars, rettv)
|
||||
++l->lv_refcount;
|
||||
|
||||
for (i = start; stride > 0 ? i <= end : i >= end; i += stride)
|
||||
{
|
||||
li = listitem_alloc();
|
||||
if (li == NULL)
|
||||
if (list_append_number(l, (varnumber_T)i) == FAIL)
|
||||
break;
|
||||
li->li_tv.v_type = VAR_NUMBER;
|
||||
li->li_tv.v_lock = 0;
|
||||
li->li_tv.vval.v_number = i;
|
||||
list_append(l, li);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -13887,17 +13900,57 @@ f_spellbadword(argvars, rettv)
|
||||
typval_T *argvars;
|
||||
typval_T *rettv;
|
||||
{
|
||||
char_u *word = (char_u *)"";
|
||||
#ifdef FEAT_SYN_HL
|
||||
int len;
|
||||
int attr = 0;
|
||||
list_T *l;
|
||||
#endif
|
||||
|
||||
rettv->vval.v_string = NULL;
|
||||
rettv->v_type = VAR_STRING;
|
||||
l = list_alloc();
|
||||
if (l == NULL)
|
||||
return;
|
||||
rettv->v_type = VAR_LIST;
|
||||
rettv->vval.v_list = l;
|
||||
++l->lv_refcount;
|
||||
|
||||
#ifdef FEAT_SYN_HL
|
||||
/* Find the start and length of the badly spelled word. */
|
||||
len = spell_move_to(curwin, FORWARD, TRUE, TRUE, NULL);
|
||||
if (len != 0)
|
||||
rettv->vval.v_string = vim_strnsave(ml_get_cursor(), len);
|
||||
if (argvars[0].v_type == VAR_UNKNOWN)
|
||||
{
|
||||
/* Find the start and length of the badly spelled word. */
|
||||
len = spell_move_to(curwin, FORWARD, TRUE, TRUE, &attr);
|
||||
if (len != 0)
|
||||
word = ml_get_cursor();
|
||||
}
|
||||
else if (curwin->w_p_spell && *curbuf->b_p_spl != NUL)
|
||||
{
|
||||
char_u *str = get_tv_string_chk(&argvars[0]);
|
||||
int capcol = -1;
|
||||
|
||||
if (str != NULL)
|
||||
{
|
||||
/* Check the argument for spelling. */
|
||||
while (*str != NUL)
|
||||
{
|
||||
len = spell_check(curwin, str, &attr, &capcol);
|
||||
if (attr != 0)
|
||||
{
|
||||
word = str;
|
||||
break;
|
||||
}
|
||||
str += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
list_append_string(l, word, len);
|
||||
list_append_string(l, (char_u *)(
|
||||
attr == highlight_attr[HLF_SPB] ? "bad" :
|
||||
attr == highlight_attr[HLF_SPR] ? "rare" :
|
||||
attr == highlight_attr[HLF_SPL] ? "local" :
|
||||
attr == highlight_attr[HLF_SPC] ? "caps" :
|
||||
""), -1);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -13969,7 +14022,6 @@ f_split(argvars, rettv)
|
||||
char_u patbuf[NUMBUFLEN];
|
||||
char_u *save_cpo;
|
||||
int match;
|
||||
listitem_T *ni;
|
||||
list_T *l;
|
||||
colnr_T col = 0;
|
||||
int keepempty = FALSE;
|
||||
@ -14017,13 +14069,8 @@ f_split(argvars, rettv)
|
||||
if (keepempty || end > str || (l->lv_len > 0 && *str != NUL
|
||||
&& match && end < regmatch.endp[0]))
|
||||
{
|
||||
ni = listitem_alloc();
|
||||
if (ni == NULL)
|
||||
if (list_append_string(l, str, (int)(end - str)) == FAIL)
|
||||
break;
|
||||
ni->li_tv.v_type = VAR_STRING;
|
||||
ni->li_tv.v_lock = 0;
|
||||
ni->li_tv.vval.v_string = vim_strnsave(str, end - str);
|
||||
list_append(l, ni);
|
||||
}
|
||||
if (!match)
|
||||
break;
|
||||
@ -14583,7 +14630,7 @@ f_tagfiles(argvars, rettv)
|
||||
get_tagfname(TRUE, NULL);
|
||||
for (;;)
|
||||
if (get_tagfname(FALSE, fname) == FAIL
|
||||
|| list_append_string(l, fname) == FAIL)
|
||||
|| list_append_string(l, fname, -1) == FAIL)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -4520,6 +4520,14 @@ do_sub(eap)
|
||||
sublen = vim_regsub_multi(®match, sub_firstlnum,
|
||||
sub, sub_firstline, FALSE, p_magic, TRUE);
|
||||
|
||||
/* When the match included the "$" of the last line it may
|
||||
* include one line too much. */
|
||||
if (nmatch > curbuf->b_ml.ml_line_count - sub_firstlnum + 1)
|
||||
{
|
||||
nmatch = curbuf->b_ml.ml_line_count - sub_firstlnum + 1;
|
||||
skip_match = TRUE;
|
||||
}
|
||||
|
||||
/* Need room for:
|
||||
* - result so far in new_start (not for first sub in line)
|
||||
* - original text up to match
|
||||
|
@ -2109,7 +2109,11 @@ ex_emenu(eap)
|
||||
|
||||
/* Found the menu, so execute.
|
||||
* Use the Insert mode entry when returning to Insert mode. */
|
||||
if (restart_edit && !current_SID)
|
||||
if (restart_edit
|
||||
#ifdef FEAT_EVAL
|
||||
&& !current_SID
|
||||
#endif
|
||||
)
|
||||
{
|
||||
mode = (char_u *)"Insert";
|
||||
idx = MENU_INDEX_INSERT;
|
||||
@ -2168,10 +2172,12 @@ ex_emenu(eap)
|
||||
{
|
||||
/* When executing a script or function execute the commands right now.
|
||||
* Otherwise put them in the typeahead buffer. */
|
||||
#ifdef FEAT_En
|
||||
if (current_SID != 0)
|
||||
exec_normal_cmd(menu->strings[idx], menu->noremap[idx],
|
||||
menu->silent[idx]);
|
||||
else
|
||||
#endif
|
||||
ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
|
||||
TRUE, menu->silent[idx]);
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ STARTTEST
|
||||
normal 0f:]s
|
||||
let prevbad = ''
|
||||
while 1
|
||||
let bad = spellbadword()
|
||||
let [bad, a] = spellbadword()
|
||||
if bad == '' || bad == prevbad || bad == 'badend'
|
||||
break
|
||||
endif
|
||||
@ -60,31 +60,31 @@ gg:/^addstart/+1,/^addend/-1w! Xtest.latin1.add
|
||||
:mkspell! Xtest.latin1.add.spl Xtest.latin1.add
|
||||
:set spellfile=Xtest.latin1.add
|
||||
/^test2:
|
||||
]s:let str = spellbadword()
|
||||
]s:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
:set spl=Xtest_us.latin1.spl
|
||||
/^test2:
|
||||
]smm:let str = spellbadword()
|
||||
]smm:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
`m]s:let str = spellbadword()
|
||||
`m]s:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
:set spl=Xtest_gb.latin1.spl
|
||||
/^test2:
|
||||
]smm:let str = spellbadword()
|
||||
]smm:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
`m]s:let str = spellbadword()
|
||||
`m]s:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
:set spl=Xtest_nz.latin1.spl
|
||||
/^test2:
|
||||
]smm:let str = spellbadword()
|
||||
]smm:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
`m]s:let str = spellbadword()
|
||||
`m]s:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
:set spl=Xtest_ca.latin1.spl
|
||||
/^test2:
|
||||
]smm:let str = spellbadword()
|
||||
]smm:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
`m]s:let str = spellbadword()
|
||||
`m]s:let [str, a] = spellbadword()
|
||||
:$put =str
|
||||
:"
|
||||
:" Postponed prefixes
|
||||
|
Loading…
x
Reference in New Issue
Block a user