Hi Bram
On 2015-07-22 Wednesday at 02:01 +0200 Roland Eggner wrote:
> On 2015-07-22 Wednesday at 00:25 +0200 Roland Eggner wrote:
> > On 2015-07-21 Tuesday at 14:04 +0200 Bram Moolenaar wrote:
> > > Roland Eggner wrote:
> > > > Despite having used vim, “:help …” and “:helpgrep …” almost daily for 9
> > > > years
> > > > I was not aware of the special effect of the equal sign in `= … ` until
> > > > a recent bugreport from Pavol Juhas regarding this feature.
> > > > Surprisingly
> > > > “:help improvements-6” hints, that this feature has been there since
> > > > early
> > > > days of the vim-6 period.
> > > >
> > > > My patch provided below should
> > > > • improve accessibility of “:help `=” by adding references at useful
> > > > points
> > > > in “runtime/doc/cmdline.txt” -- currently there are no such
> > > > references at all
> > > > • improve “:help `=” by adding a hint, under which condition this
> > > > feature can
> > > > be used
> > >
> > > Thanks!
> >
> > v2:
> > • “:help `-expansion”:
> > Improved example and added a 2nd one.
> > • “:help `=”:
> > Added a 2nd example showing how to refer environment variables using
> > “expand( … )”.
> > Added a 3rd example showing what interesting, only in rare cases desired
> > effects are possible when the “expand( … )” call is missing and the
> > value --
> > not only the name -- of an environment variable is evaluated (inspired
> > by
> > issue 385 “expansion of environment variables fails in Vim backtick
> > expression”).
> > • Fixed a few typos spotted nearby.
>
> v3:
> Updated for vim-7.4.794.
> Previous versions accidentally where based on 7.4.529, sorry.
v4:
Further improvements based on imput from Pavol Juhas (mail thread “Issue 385 in
vim: expansion of environment variables fails in Vim backtick expression”).
For easier review 6 lines of context instead of the usual 3.
I am unsure if the added tag is a proper solution: There is already a tag
“E15”, thus I chose the tag name “E15_`”. It should help if someone uses the
`=
syntax, gets “E15”, and types “:h E15<TAB>”. Is there a better solution to
guide users getting „E15” to |`=| ?
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -747,19 +747,19 @@ output.
Note: These are special characters in the executed command line. If you want
to insert special things while typing you can use the CTRL-R command. For
example, "%" stands for the current file name, while CTRL-R % inserts the
current file name right away. See |c_CTRL-R|.
-Note: If you want to avoid the special characters in a Vim script you may want
-to use |fnameescape()|. Also see |`=|.
+Note: If you want to avoid the effects of special characters in a Vim script
+you may want to use |fnameescape()|. Also see |`=|.
In Ex commands, at places where a file name can be used, the following
characters have a special meaning. These can also be used in the expression
-function expand() |expand()|.
+function |expand()|.
% Is replaced with the current file name. *:_%* *c_%*
# Is replaced with the alternate file name. *:_#* *c_#*
This is remembered for every window.
#n (where n is a number) is replaced with *:_#0* *:_#n*
the file name of buffer n. "#0" is the same as "#". *c_#n*
## Is replaced with all names in the argument list *:_##* *c_##*
@@ -789,12 +789,13 @@ Detail: The special meaning is always escaped when there
is a backslash before
it, no matter how many backslashes.
you type: result ~
# alternate.file
\# #
\\# \#
Also see |`=|.
+
*:<cword>* *:<cWORD>* *:<cfile>* *<cfile>*
*:<sfile>* *<sfile>* *:<afile>* *<afile>*
*:<abuf>* *<abuf>* *:<amatch>* *<amatch>*
*<slnum>* *E495* *E496* *E497* *E499* *E500*
Note: these are typed literally, they are not special keys!
<cword> is replaced with the word under the cursor (like |star|)
@@ -809,13 +810,13 @@ Note: these are typed literally, they are not special
keys!
buffer).
<amatch> When executing autocommands, is replaced with the match for
which this autocommand was executed. It differs from
<afile> only when the file name isn't used to match with
(for FileType, Syntax and SpellFileMissing events).
<sfile> When executing a ":source" command, is replaced with the
- file name of the sourced file. *E498*
+ file name of the sourced file. *E498*
When executing a function, is replaced with
"function {function-name}"; function call nesting is
indicated like this:
"function {function-name1}..{function-name2}". Note that
filename-modifiers are useless when <sfile> is used inside
a function.
@@ -931,15 +932,14 @@ name). This is included for backwards compatibility with
version 3.0, the
<cWORD> WORD under the cursor (see |WORD|)
<cfile> path name under the cursor
<cfile>< idem, without extension
Note: Where a file name is expected wildcards expansion is done. On Unix the
shell is used for this, unless it can be done internally (for speed).
-Backticks also work, like in >
+Unless in |restricted-mode|, backticks work also, like in >
:n `echo *.c`
-(backtick expansion is not possible in |restricted-mode|)
But expansion is only done if there are any wildcards before expanding the
'%', '#', etc.. This avoids expanding wildcards inside a file name. If you
want to expand the result of <cfile>, add a wildcard character to it.
Examples: (alternate file name is "?readme?")
command expands to ~
:e # :e ?readme?
@@ -964,13 +964,12 @@ special meaning. Therefore "\file\foo" is a valid file
name, you don't have
to type the backslash twice.
An exception is the '$' sign. It is a valid character in a file name. But
to avoid a file name like "$home" to be interpreted as an environment variable,
it needs to be preceded by a backslash. Therefore you need to use "/\$home"
for the file "$home" in the root directory. A few examples:
-
FILE NAME INTERPRETED AS ~
$home expanded to value of environment var $home
\$home file "$home" in current directory
/\$home file "$home" in root directory
\\$home file "\\", followed by expanded $home
Also see |`=|.
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -409,33 +409,50 @@ directory. Example: >
:n /usr/inc**/*.h
Finds files:
/usr/include/types.h
/usr/include/sys/types.h
/usr/inc_old/types.h
*backtick-expansion* *`-expansion*
-On Unix and a few other systems you can also use backticks in the file name,
-for example: >
- :e `find . -name ver\\*.c -print`
-The backslashes before the star are required to prevent "ver*.c" to be
-expanded by the shell before executing the find program.
-This also works for most other systems, with the restriction that the
-backticks must be around the whole item. It is not possible to have text
+On Unix and a few other systems you can also use backticks in the file name
+argument. E.g. add to the argument list all *.c files in and below the
+current directory modified within 1 hour, and view the youngest *.patch file
+in the current directory: >
+ :argadd `find . -name \\*.c -mmin -60 -print`
+ :view `ls -t *.patch \| head -n1`
+The backslashes before the star are required to prevent the shell from
+expanding "*.c" prior to execution of the find program. The backslash before
+the shell pipe symbol "|" prevents Vim from parsing it as command termination.
+This also works for most other systems, with the restriction that the
+backticks must be around the whole item. It is not possible to have text
directly before the first or just after the last backtick.
- *`=*
-You can have the backticks expanded as a Vim expression, instead of an
-external command, by using the syntax `={expr}` e.g.: >
- :e `=tempname()`
-The expression can contain just about anything, thus this can also be used to
-avoid the special meaning of '"', '|', '%' and '#'. However, 'wildignore'
-does apply like to other wildcards.
-If the expression returns a string then names are to be separated with line
-breaks. When the result is a |List| then each item is used as a name. Line
-breaks also separate names.
-Note that such expressions are only supported in places where a filename is
-expected as an argument to an Ex-command.
+ *`=* *E15_`*
+You can have the backticks expanded as a Vim expression, instead of as an
+external command, by using the syntax ``={expr}``. The expression can contain
+just about anything, thus this can also be used to save the escaping of spaces
+and characters with otherwise special meaning '"', '|', '%' and '#' (5th and
+6th example below). However, 'wildignore' does apply like to other wildcards.
+If the expression contains an unquoted environment variable reference without
+call to |expand()|, the value of this variable -- not only its name -- is
+evaluated as a Vim expression (3rd and 4th example below). Single or double
+quotes can be used to avoid this effect (5th and 6th example below). See also
+|expr-env-expand|.
+Some examples illustrate possible usages:
+ :edit ``=tempname()``
+ :edit `=expand('$HOME') . '/.vimrc'`
+ :let home = 2
+ :let user = 3 " assuming $HOME == '/home/user'
+ :edit `=36 $HOME . '/.vimrc'` " creates a buffer '6/.vimrc'
+ :edit `=$Hquoted . '/.vimrc'` " assuming $Hquoted == '"/home/user"'
+ :edit `='$HOME/filename with spaces + "ugly" % | # characters'`
+ :edit `="$HOME/filename with spaces + 'ugly' % | # characters"`
+If the expression returns a string then names are to be terminated by line
+terminators. When the result is a |List| then each item is used as a name.
+Line terminators also terminate names.
+Note that such expressions are only supported at places where a filename is
+expected as an argument to an Ex command.
*++opt* *[++opt]*
The [++opt] argument can be used to force the value of 'fileformat',
'fileencoding' or 'binary' to a value for one command, and to specify the
behavior for bad characters. The form is: >
++{optname}
@@ -1362,13 +1379,13 @@ There are a few things to remember when editing binary
files:
- Make sure the 'binary' option is set BEFORE loading the
file. Otherwise both <CR> <NL> and <NL> are considered to end a line
and when the file is written the <NL> will be replaced with <CR> <NL>.
- <Nul> characters are shown on the screen as ^@. You can enter them with
"CTRL-V CTRL-@" or "CTRL-V 000" {Vi cannot handle <Nul> characters in the
file}
-- To insert a <NL> character in the file split up a line. When writing the
+- To insert a <NL> character in the file split a line. When writing the
buffer to a file a <NL> will be written for the <EOL>.
- Vim normally appends an <EOL> at the end of the file if there is none.
Setting the 'binary' option prevents this. If you want to add the final
<EOL>, set the 'endofline' option. You can also read the value of this
option to see if there was an <EOL> for the last line (you cannot see this
in the text).
@@ -1392,13 +1409,14 @@ to see your text while you are editing it. When
filtering text with
":!filter" or using ":w !command" the text is also not encrypted, this may
reveal it to others. The 'viminfo' file is not encrypted.
You could do this to edit very secret text: >
:set noundofile viminfo=
:noswapfile edit secrets.txt
-Keep in mind that without a swap file you risk losing your work in a crash.
+Keep in mind that without a swap file you risk loosing your work in the event
+of a crash or a power failure.
WARNING: If you make a typo when entering the key and then write the file and
exit, the text will be lost!
The normal way to work with encryption, is to use the ":X" command, which will
ask you to enter a key. A following write command will use that key to
diff --git a/runtime/doc/tags b/runtime/doc/tags
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -3548,12 +3548,13 @@ E153 helphelp.txt /*E153*
E154 helphelp.txt /*E154*
E155 sign.txt /*E155*
E156 sign.txt /*E156*
E157 sign.txt /*E157*
E158 sign.txt /*E158*
E159 sign.txt /*E159*
+E15_` editing.txt /*E15_`*
E16 cmdline.txt /*E16*
E160 sign.txt /*E160*
E161 repeat.txt /*E161*
E162 message.txt /*E162*
E163 editing.txt /*E163*
E164 editing.txt /*E164*
--
Best regards,
Roland Eggner
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
pgpB9MSpfGHcF.pgp
Description: PGP signature
