changeset 333:18f024844150 v7.0086

updated for version 7.0086
author vimboss
date Thu, 16 Jun 2005 21:59:56 +0000
parents d5e895294dce
children a1270013cb34
files runtime/doc/repeat.txt runtime/doc/spell.txt runtime/doc/todo.txt runtime/doc/version7.txt runtime/filetype.vim runtime/indent/pascal.vim runtime/indent/vim.vim src/gui_w32.c src/proto/misc2.pro src/search.c src/version.h
diffstat 11 files changed, 242 insertions(+), 195 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/repeat.txt
+++ b/runtime/doc/repeat.txt
@@ -1,4 +1,4 @@
-*repeat.txt*    For Vim version 7.0aa.  Last change: 2005 Apr 01
+*repeat.txt*    For Vim version 7.0aa.  Last change: 2005 Jun 16
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -290,7 +290,7 @@ first line has something like ":map <F1>
 the first line ends in a <CR>, but following ones don't, you will get an error
 message, because the <CR> from the first lines will be lost.
 
-Macintosh: Files that are read with ":source" normally have <CR> <EOL>s.
+Mac Classic: Files that are read with ":source" normally have <CR> <EOL>s.
 These always work.  If you are using a file with <NL> <EOL>s (for example, a
 file made on Unix), this will be recognized if 'fileformats' is not empty and
 the first line does not end in a <CR>.  Be careful not to use a file with <NL>
--- a/runtime/doc/spell.txt
+++ b/runtime/doc/spell.txt
@@ -1,4 +1,4 @@
-*spell.txt*	For Vim version 7.0aa.  Last change: 2005 Jun 14
+*spell.txt*	For Vim version 7.0aa.  Last change: 2005 Jun 16
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -25,9 +25,9 @@ This command switches on spell checking:
 This switches on the 'spell' option and specifies to check for US English.
 
 The words that are not recognized are highlighted with one of these:
-	SpellBad	word not recognized
-	SpellRare	rare word
-	SpellLocal	wrong spelling for selected region
+	SpellBad	word not recognized			|hl-SpellBad|
+	SpellRare	rare word				|hl-SpellRare|
+	SpellLocal	wrong spelling for selected region	|hl-SpellLocal|
 
 Vim only checks words for spelling, there is no grammar check.
 
@@ -63,9 +63,10 @@ zw			Add word under the cursor as a wron
 			'spellfile'.  In Visual mode the selected characters
 			are added as a word (including white space!).
 
-							*:spellg* *:spellgood*
-:spellg[ood] {word}	Add [word} as a good word to 'spellfile'.
+							*:spe* *:spellgood*
+:spe[llgood] {word}	Add [word} as a good word to 'spellfile'.
 
+							*:spellw* *:spellwrong*
 :spellw[rong] {word}	Add [word} as a wrong (bad) word to 'spellfile'.
 
 After adding a word to 'spellfile' its associated ".spl" file will
@@ -117,7 +118,7 @@ comes in (at least) these variants:
 	en_us		USA
 
 Words that are not used in one region but are used in another region are
-highlighted with |SpellLocal|.
+highlighted with SpellLocal |hl-SpellLocal|.
 
 Always use lowercase letters for the language and region names.
 
@@ -223,7 +224,7 @@ find them here:
 	http://lingucomponent.openoffice.org/spell_dic.html
 You can also use a plain word list.
 
-:mksp[ell] [-ascii] {outname} {inname} ...		*:mksp* *:mkspell*
+:mksp[ell][!] [-ascii] {outname} {inname} ...		*:mksp* *:mkspell*
 			Generate a Vim spell file word lists.  Example: >
 		:mkspell nl nl_NL.words
 <
@@ -233,6 +234,9 @@ You can also use a plain word list.
 			{outname}.{encoding}.spl.  {encoding} is the value of
 			the 'encoding' option.
 
+			When the output file already exists [!] must be added
+			to overwrite it.
+
 			When the [-ascii] argument is present, words with
 			non-ascii characters are skipped.  The resulting file
 			ends in "ascii.spl".
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Jun 14
+*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Jun 16
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -30,6 +30,8 @@ be worked on, but only if you sponsor Vi
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+synID() no longer works.
+
 Range(0) should return an empty list (Servatius Brandt).
 
 :let @= 'asdf' gives confusing error message.  Make @= writable?
@@ -77,6 +79,9 @@ changed.
 Include new PHP indent script from John Wellesz?
     http://www.vim.org/scripts/download_script.php?src_id=4330
 
+In Vim indenting use synID() to avoid recognizing "|en" in a string as
+"|endif".
+
 autoload:
 - Add a Vim script in $VIMRUNTIME/tools that takes a file with a list of
   script names and a help file and produces a script that can be sourced to
@@ -88,6 +93,9 @@ autoload:
     helpfile doc/myscript.txt
   For the "helpfile" item ":helptags" is run.
 
+For List comparing, consider [4] and ['4'] different? (Servatius Brandt)
+Also allows strict comparing for ordinary variables.
+
 Patch to alternate fold highlighting.  (Anthony Iano-Fletcher, 2005 May 12)
 More levels?
 
@@ -105,9 +113,18 @@ PLANNED FOR VERSION 7.0:
 	- Code for making suggestions:
 	  - Aspell has the "special" character, useful?
 	  - The score is a bit wrong for substituting multi-byte characters.
+	    At the head byte remember how may bytes are still to follow, do
+	    the scoring at the tail byte.  But don't even try when the score
+	    plus the minimal penalty (similar char) goes over maximum.
 	  - similar_chars() is too slow.
-	  - Swapping works with bytes instead of characters.
-	  - The sound-folding doesn't work for multi-byte characters.
+		use a lookuptable for single-byte
+		use a hashtable for multi-byte
+		support letter appearing in several lists?
+	  - When putting map string in .spl file check for duplicate chars.
+	  - GUI: Selecting text doesn't work at the prompt.
+	  - Should "z?" replacement be redo-able with "."?
+	  - The sound-folding doesn't work for multi-byte characters.  It's
+	    very slow too.  Prepare the table (remove alternatives)?
 	- Also put list of word characters in word list file.  Otherwise the
 	  one for Italian may differ from the one used for English.
 	- Make "en-rare" spell file.
@@ -182,6 +199,7 @@ PLANNED FOR VERSION 7.0:
     - Put the list of choices right under the place where they would be
       inserted.
     - Pre-expand abbreviations, show which abbrevs would match?
+    - Completion in .NET framework SharpDevelop: http://www.icsharpcode.net
 -   UNDO TREE: keep all states of the text, don't delete undo info.
     When making a change, instead of clearing any future undo (thus redo)
     info, make a new branch.
@@ -288,7 +306,7 @@ Don't count it in only_one_window(). (Al
 
 Win32: Patch for Korean IME. (Yusung, 2005 March 21)
 
-When "= evaluation results in a list, use it as a sequence of lines.
+When "= evaluation results in a List, use it as a sequence of lines.
 
 Support ":set syntax=cpp.doxygen"?  Suggested patch by Michael Geddes (9 Aug
 2004).  Should also work for 'filetype'.
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -1,4 +1,4 @@
-*version7.txt*  For Vim version 7.0aa.  Last change: 2005 Jun 13
+*version7.txt*  For Vim version 7.0aa.  Last change: 2005 Jun 15
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -657,6 +657,10 @@ Grahame Bowland and Evan Webb.
 Added ":scriptnames" to bugreport.vim, so that we can see what plugins were
 used.
 
+Win32: If the user changes the setting for the number of lines a scroll wheel
+click scrolls it is now used immediately.  Previously Vim would need to be
+restarted.
+
 ==============================================================================
 COMPILE TIME CHANGES					*compile-changes-7*
 
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2005 May 20
+" Last Change:	2005 Jun 16
 
 " Listen very carefully, I will say this only once
 if exists("did_load_filetypes")
@@ -543,6 +543,9 @@ au BufNewFile,BufRead *.exp			setf expec
 " Exports
 au BufNewFile,BufRead exports			setf exports
 
+" Factor
+au BufNewFile,BufRead *.factor			setf factor
+
 " Fetchmail RC file
 au BufNewFile,BufRead .fetchmailrc		setf fetchmail
 
--- a/runtime/indent/pascal.vim
+++ b/runtime/indent/pascal.vim
@@ -1,173 +1,173 @@
-" Vim indent file
-" Language:    Pascal
-" Maintainer:  Neil Carter <n.carter@swansea.ac.uk>
-" Created:     2004 Jul 13
-" Last Change: 2005 Jun 07
-" TODO: Reduce indentation on line after a statement that flowed across
-" two lines (e.g. parameter list closed on second line). Also, increase
-" indent of a becomes-statement that flows onto second line.
-
-" Only load this indent file when no other was loaded.
-if exists("b:did_indent")
-   finish
-endif
-let b:did_indent = 1
-
-setlocal indentexpr=GetPascalIndent(v:lnum)
-" Appending an & to an option sets it to its default value.
-setlocal indentkeys&
-setlocal indentkeys+=~end;,=~const,=~type,=~var,=~begin,=~repeat,=~until,=~for
-setlocal indentkeys+=~program,=~function,=~procedure,=~object,=~private
-setlocal indentkeys+=~record,=~if,=~else,=~case
-
-if exists("*GetPascalIndent")
-	finish
-endif
-
-
-function s:GetPrevLineNum( line_num )
-	
-	" Skip over comments and conditional directives
-	let SKIP_LINES = '^\s*\((\*\)\|\(\*\ \)\|\(\*)\)\|\({\$\)'
-	
-	let nline = a:line_num
-	while nline > 0
-		let nline = prevnonblank(nline-1)
-		if getline(nline) !~? SKIP_LINES
-			break
-		endif
-	endwhile
-	
-"	call input( "nline = ".nline )
-	
-	return nline
-
-endfunction
-
-
-function! GetPascalIndent( line_num )
-	if a:line_num == 0
-		return 0
-	endif
-
-	" If in the middle of a three-part comment
-	if getline( a:line_num ) =~ '^\s*\*\ '
-		return indent( a:line_num )
-	endif
-	
-	" We have to subtract one to start on the line before the current
-	" one. Otherwise, prevnonblank() returns the current line!
-	let prev_line_num = s:GetPrevLineNum( a:line_num )
-	let prev_line = getline( prev_line_num )
-	let indnt = indent( prev_line_num )
-
-	let this_line = getline( a:line_num )
-
-	" At the start of a block, we have to indent the newly-created line
-	" based on the previous line.
-	" =~ means matches a regular expression
-	" a question mark after =~ means ignore case (# means match case)
-	" const, type, var should always appear at the start of a line, but
-	" begin can appear anywhere in the line.
-	" if one of the following keywords appear in the previous line with
-	" nothing before it but optional whitespace, and nothing after it.
-	" Has to be end of line at end to show this is not a routine
-	" parameter list. Otherwise, you'd end up with cascading vars.
-	
-	" These words appear alone on a line (apart from whitespace).
-	if prev_line =~ '^\s*\(const\|var\|begin\|repeat\|private\)$'
-		" Place an & before an option to obtain its value.
-		let indnt = indnt + &shiftwidth
-	endif
-
-	" Words preceded by optional whitespace and followed by anything.
-	if prev_line =~ '^\s*\(for\|if\|else\|case\)'
-		" Place an & before an option to obtain its value.
-		let indnt = indnt + &shiftwidth
-		" if this is a multistatement block then we need to align the
-		" begin with the previous line.
-		if this_line =~ '^\s*begin'
-			let indnt = indnt - &shiftwidth
-		endif
-	endif
-	" These words may have text before them on the line (hence the .*).
-	if prev_line =~ '^.*\s*\<\(object\|record\)\>$'
-		let indnt = indnt + &shiftwidth
-	endif
-	" If we have opened a bracket and the contents spills over one line,
-	" then indent one level beyond the bracket's first line. RE = an
-	" opening bracket followed by any amount of anything other than a
-	" closing bracket and then the end-of-line. If we didn't include the
-	" end of line, this RE would match even closed brackets, since it
-	" would match everything up to the closing bracket.
-	" This test isn't clever enough to handle brackets inside strings or
-	" comments.
-	if prev_line =~ '([^*][^)]*$'
-		let indnt = indnt + &shiftwidth
-	endif
-	
-	" If we just closed a bracket that started on a previous line, then
-	" unindent.
-	if prev_line =~ '^[^(]*[^*])'
-		let indnt = indnt - &shiftwidth
-	endif
-
-	" At the end of a block, we have to unindent both the current line
-	" (the 'end;' for instance) and the newly-created line.
-	if this_line =~ '^\s*\(end;\|until\|else\)'
-		let indnt = indnt - &shiftwidth
-	endif
-
-	" Keywords that always appear at the start of a line.
-	" Problem is that function and procedure keywords should be indented
-	" if within a class declaration.
-	if this_line =~ '^\s*\<type\|uses\|$IFDEF\|$ENDIF\|procedure\|function\>'
-		let indnt = 0
-	endif
-	if prev_line =~ '^\s*\<type\|uses\>'
-		let indnt = &shiftwidth
-	endif
-	
-	" Put conditional compile directives on first column.
-	if this_line =~ '^\s*{\$'
-		let indnt = 0
-	endif
-	
-	return indnt
-endfunction
-
-" TODO: end; should align with the previous (begin/record/object/else).
-" "else begin" is the only case where begin does not appear at the start
-" of the line.
-
-" TODO: Don't align with {$IFDEF}
-
-"Example from vb.vim
-" regular expression match, case insensitive
-"if previous_line =~? 
-" start of line, zero or more whitespace
-"'^\s*
-" start of word
-"\<
-" 
-"\(
-"	begin\|
-"	\%(
-"		\%(
-"			private\|public\|friend
-"		\)
-"		\s\+
-"	\)
-"	zero or more of the previous atom
-"	\=
-"	\%(
-"		function\|sub\|property
-"	\)
-"	\|select\|case\|default\|if
-"\>
-"	.\{-}\<then\>\s*$\|else\|elseif\|do\|for\|while\|enum\|with
-"\)
-" end of word
-"\>'
-"	let ind = ind + &sw
-"endif
+" Vim indent file
+" Language:    Pascal
+" Maintainer:  Neil Carter <n.carter@swansea.ac.uk>
+" Created:     2004 Jul 13
+" Last Change: 2005 Jun 15
+
+
+if exists("b:did_indent")
+	finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetPascalIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==end;,==const,==type,==var,==begin,==repeat,==until,==for
+setlocal indentkeys+==program,==function,==procedure,==object,==private
+setlocal indentkeys+==record,==if,==else,==case
+
+if exists("*GetPascalIndent")
+	finish
+endif
+
+
+function! s:GetPrevNonCommentLineNum( line_num )
+
+	" Skip lines starting with a comment
+	let SKIP_LINES = '^\s*\(\((\*\)\|\(\*\ \)\|\(\*)\)\|{\|}\)'
+
+	let nline = a:line_num
+	while nline > 0
+		let nline = prevnonblank(nline-1)
+		if getline(nline) !~? SKIP_LINES
+			break
+		endif
+	endwhile
+
+	return nline
+endfunction
+
+
+function! GetPascalIndent( line_num )
+	" Line 0 always goes at column 0
+	if a:line_num == 0
+		return 0
+	endif
+
+	let this_codeline = getline( a:line_num )
+
+	" If in the middle of a three-part comment
+	if this_codeline =~ '^\s*\*'
+		return indent( a:line_num )
+	endif
+
+	let prev_codeline_num = s:GetPrevNonCommentLineNum( a:line_num )
+	let prev_codeline = getline( prev_codeline_num )
+	let indnt = indent( prev_codeline_num )
+
+	" Compiler directives should always go in column zero.
+	if this_codeline =~ '^\s*{\(\$IFDEF\|\$ELSE\|\$ENDIF\)'
+		return 0
+	endif
+
+	" These items have nothing before or after (not even a comment), and
+	" go on column 0. Make sure that the ^\s* is followed by \( to make
+	" ORs work properly, and not include the start of line (this must
+	" always appear).
+	" The bracketed expression with the underline is a routine
+	" separator. This is one case where we do indent comment lines.
+	if this_codeline =~ '^\s*\((\*\ _\+\ \*)\|\<\(const\|var\)\>\)$'
+		return 0
+	endif
+
+	" These items may have text after them, and go on column 0 (in most
+	" cases). The problem is that "function" and "procedure" keywords
+	" should be indented if within a class declaration.
+	if this_codeline =~ '^\s*\<\(program\|type\|uses\|procedure\|function\)\>'
+		return 0
+	endif
+
+	" BEGIN
+	" If the begin does not come after "if", "for", or "else", then it
+	" goes in column 0
+	if this_codeline =~ '^\s*begin\>' && prev_codeline !~ '^\s*\<\(if\|for\|else\)\>'
+		return 0
+	endif
+
+	" These keywords are indented once only.
+	if this_codeline =~ '^\s*\<\(private\)\>'
+		return &shiftwidth
+	endif
+
+	" If the PREVIOUS LINE contained these items, the current line is
+	" always indented once.
+	if prev_codeline =~ '^\s*\<\(type\|uses\)\>'
+		return &shiftwidth
+	endif
+
+	" These keywords are indented once only. Possibly surrounded by
+	" other chars.
+	if this_codeline =~ '^.\+\<\(object\|record\)\>'
+		return &shiftwidth
+	endif
+
+	" If the previous line was indenting...
+	if prev_codeline =~ '^\s*\<\(for\|if\|case\|else\|end\ else\)\>'
+		" then indent.
+		let indnt = indnt + &shiftwidth
+		" BUT... if this is the start of a multistatement block then we
+		" need to align the begin with the previous line.
+		if this_codeline =~ '^\s*begin\>'
+			return indnt - &shiftwidth
+		endif
+
+		" We also need to keep the indentation level constant if the
+		" whole if-then statement was on one line.
+		if prev_codeline =~ '\<then\>.\+'
+			let indnt = indnt - &shiftwidth
+		endif
+	endif
+
+	" PREVIOUS-LINE BEGIN
+	" If the previous line was an indenting keyword then indent once...
+	if prev_codeline =~ '^\s*\<\(const\|var\|begin\|repeat\|private\)\>'
+		" But only if this is another var in a list.
+		if this_codeline !~ '^\s*var\>'
+			return indnt + &shiftwidth
+		endif
+	endif
+
+	" PREVIOUS-LINE BEGIN
+	" Indent code after a case statement begin
+	if prev_codeline =~ '\:\ begin\>'
+		return indnt + &shiftwidth
+	endif
+
+	" These words may have text before them on the line (hence the .*)
+	" but are followed by nothing. Always indent once only.
+	if prev_codeline =~ '^\(.*\|\s*\)\<\(object\|record\)\>$'
+		return indnt + &shiftwidth
+	endif
+
+	" If we just closed a bracket that started on a previous line, then
+	" unindent. But don't return yet -- we need to check for further
+	" unindentation (for end/until/else)
+	if prev_codeline =~ '^[^(]*[^*])'
+		let indnt = indnt - &shiftwidth
+	endif
+
+	" At the end of a block, we have to unindent both the current line
+	" (the "end" for instance) and the newly-created line.
+	if this_codeline =~ '^\s*\<\(end\|until\|else\)\>'
+		return indnt - &shiftwidth
+	endif
+
+	" If we have opened a bracket and it continues over one line,
+	" then indent once.
+	"
+	" RE = an opening bracket followed by any amount of anything other
+	" than a closing bracket and then the end-of-line.
+	"
+	" If we didn't include the end of line, this RE would match even
+	" closed brackets, since it would match everything up to the closing
+	" bracket.
+	"
+	" This test isn't clever enough to handle brackets inside strings or
+	" comments.
+	if prev_codeline =~ '([^*]\=[^)]*$'
+		return indnt + &shiftwidth
+	endif
+
+	return indnt
+endfunction
+
--- a/runtime/indent/vim.vim
+++ b/runtime/indent/vim.vim
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:	Vim script
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2005 Feb 25
+" Last Change:	2005 Jun 16
 
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
@@ -51,8 +51,8 @@ function GetVimIndent()
   endif
 
   " If the previous line contains an "end" after a pipe, but not in an ":au"
-  " command.
-  if getline(lnum) =~ '|\s*\(ene\@!\)' && getline(lnum) !~ '^\s*au\%[tocmd]'
+  " command.  And not when there is a backslash before the pipe.
+  if getline(lnum) =~ '[^\\]|\s*\(ene\@!\)' && getline(lnum) !~ '^\s*au\%[tocmd]'
     let ind = ind - &sw
   endif
 
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -498,6 +498,18 @@ init_mouse_wheel(void)
 	_OnScroll(hwnd, hwndCtl, zDelta >= 0 ? SB_PAGEUP : SB_PAGEDOWN, 0);
 }
 
+/*
+ * Invoked when a setting was changed.
+ */
+    static LRESULT CALLBACK
+_OnSettingChange(UINT n)
+{
+    if (n == SPI_SETWHEELSCROLLLINES)
+	SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
+		&mouse_scroll_lines, 0);
+    return 0;
+}
+
 #if 0	/* disabled, a gap appears below and beside the window, and the window
 	   can be moved (in a strange way) */
 /*
@@ -686,6 +698,10 @@ init_mouse_wheel(void)
 	_OnMouseWheel(hwnd, HIWORD(wParam));
 	break;
 
+	/* Notification for change in SystemParametersInfo() */
+    case WM_SETTINGCHANGE:
+	return _OnSettingChange((UINT)wParam);
+
 #ifdef FEAT_TOOLBAR
     case WM_NOTIFY:
 	switch (((LPNMHDR) lParam)->code)
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -94,4 +94,6 @@ void sort_strings __ARGS((char_u **files
 int pathcmp __ARGS((const char *p, const char *q, int maxlen));
 char_u *parse_list_options __ARGS((char_u *option_str, option_table_T *table, int table_size));
 int filewritable __ARGS((char_u *fname));
+int emsg3 __ARGS((char_u *s, char_u *a1, char_u *a2));
+int emsgn __ARGS((char_u *s, long n));
 /* vim: set ft=c : */
--- a/src/search.c
+++ b/src/search.c
@@ -2224,7 +2224,7 @@ check_linecomment(line)
 	    int instr = FALSE;	/* inside of string */
 
 	    p = line;		/* scan from start */
-	    while ((p = vim_strpbrk(p, "\";")) != NULL)
+	    while ((p = vim_strpbrk(p, (char_u *)"\";")) != NULL)
 	    {
 		if (*p == '"')
 		{
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 14)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 14, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 16)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 16, compiled "