/usr/share/elvis/manual/elvisexp.html is in elvis-common 2.2.0-11.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 | <html><head>
<title>Elvis-2.2_0 Arithmetic Expressions</title>
</head><body>
<h1><a name="CONTENTS"></a>13. ARITHMETIC EXPRESSIONS</h1>
<menu>
<li><a href="#13.1"> 13.1 Normal (C-like) Syntax</a>
<li><a href="#13.2"> 13.2 Functions</a>
<li><a href="#13.3"> 13.3 Subscripts</a>
<li><a href="#13.4"> 13.4 Simpler Syntax</a>
<li><a href="#13.5"> 13.5 EX Commands Which Use Expressions</a>
<li><a href="#13.6"> 13.6 VI Commands Which Use Expressions</a>
<li><a href="#13.7"> 13.7 Other Uses of Expressions</a>
</menu>
<p>Elvis can evaluate expressions involving numbers, strings, and boolean values,
using a C-like syntax.
These are used in several EX commands, one VI command, and a couple of other
situations.
<p>There are two syntaxes.
The normal syntax is extremely similar to C, and is used in circumstances
where you probably would never use a literal value, such as for the
<a href="elvisex.html#if">:if</a> command.
The simpler syntax makes literal values easier to enter, while still
making the full power of the expression evaluator available if you need it.
<h2><a name="13.1"></a><a name="NORMAL"></a>13.1 Normal (C-like) Syntax</h2>
The <a href="elvisex.html#calculate">:calculate</a> command uses the normal syntax
and displays the results.
We'll use it for most of the examples in this section.
<p>The normal syntax is intended to resemble the syntax of the C programming
language very closely.
You can't define your own functions or use flow-control constructs though;
you can only use expressions.
In traditional C documentation, these would be called "rvalues."
Basically that means you can use literal values, option names, operators,
parentheses, and some built-in functions.
<h3>13.1.1 Primary expressions</h3>
Literals can be given in any of the following formats:
<dl>
<dt>"<var>text</var>"
<dd>Any text in double-quotes is taken literally.
The usual C escapes are supported: <code>\b</code>, <code>\E</code>
(uppercase, representing the <kbd>Esc</kbd> character), <code>\f</code>,
<code>\n</code>, <code>\r</code>, and <code>\t</code>.
Also, you can use <code>\\</code> for a literal backslash character, or
<code>\"</code> for a literal double-quote character within a string.
<dt>/<var>regexp</var>/
<dd>This is a special notation for passing a regular expression as the
argument to a function such as <a href="#current">current()</a>.
In any other context, the leading '/' character would be taken as a division
operator, but as a function argument you can use
<code>/</code><var>regexp</var><code>/</code> to pass the regular expression
text.
Note that the regular expression is passed as a string;
it is equivalent to <code>"/</code><var>regexp</var><code>"</code>.
<dt>\$
<br>\(
<br>\)
<br>\\
<dd>You can use a backslash to quote a single dollar sign, parenthesis, or
backslash as though it was a string of length 1.
This was done mostly for the benefit of the <a href="#13.2">simpler syntax</a>,
where these four character are normally the only ones which have any special
interpretation.
<dt><var>digits</var>
<dd>Any word which contains only digits will be taken as a literal value.
Generally this value will be interpreted as a number,
but internally the expression evaluator always stores values as strings.
Some operators look at their arguments and act differently depending
on whether those strings happen to look like numbers or Boolean values.
<dt>0<var>octaldigits</var>
<br>0x<var>hexdigits</var>
<br>'<var>character</var>'
<dd>Octal, hex, and character constants can be used in expressions.
These are converted to decimal when they are parsed, before they are passed to any operator or function.
Passing an octal, hex, or character constant therefore is exactly like
passing the equivalent decimal number.
Elvis supports escapes as character constants:
'\0', '\b', '\E', '\f', '\n', '\r', and '\t'.
<dt>true
<br>false
<dd>These can be used as Boolean literals.
Technically, they are implemented via options (as described below) named
<a href="elvisopt.html#true">true</a> and
<a href="elvisopt.html#false">false</a>.
All of the boolean operators accept "false", "0", "", or the value of the
<a href="elvisopt.html#false">false</a> option as
Boolean <strong>false</strong> values, and
anything else as a Boolean <strong>true</strong> value.
</dl>
<p>The following examples produce <em>exactly</em> identical results.
<pre>
:calc "8"
8
:calc 8
8
:calc 010
8
:calc 0x8
8
:calc '\b'
8</pre>
<p>You can also use option names in Elvis the same way you would use variable
names in C.
<pre>
:calc list
false
:calc scroll
12
:calc display
normal</pre>
<p>There is also a pseudo-option named "_" (the underscore character).
Its value is the content of the current line.
<pre>
:calc _
Its value is the content of the current line.</pre>
<p>Additionally, a dollar sign followed by the name of an environment variable
is replaced by the value of that environment variable. If there is no such
environment variable, then Elvis will act as though it exists and has a
null value... unless there is an option with that name, in which case the
option's value is used.
(In other words, "$" is optional before option names, but mandatory before
environment variable names.)
<pre>
:calc $TERM
xterm
:calc $NOSUCHVARIABLE
:calc $autoindent
false
:calc $_
Its value is the content of the current line.</pre>
<p>In some circumstances, you can use a dollar sign followed by a digit
to access special arguments.
This is used in error messages and also in the values of a few options,
as described in <a href="#13.6">section 13.6.</a>
These special arguments can only be supplied by Elvis' internal code,
and it only supplies them in a few special circumstances so you can't use
them in <a href="elvisex.html#calculate">:calculate,</a> for example.
<h3><a name="operators">13.1.2 Operators</a></h3>
The following operators are available.
When passed integer values, these operators act like their C counterparts.
When passed string values, most of them concatenate
their arguments with the operator name in between, but some of them
do something that is useful for strings,
as described below.
Items at the top of this list have a higher precedence than those lower down.
<dl>
<dt>[ ]
<dd>Subscripts can be used for extracting substrings.
This is very powerful, and is worthy of a longer discussion than will fit
in this list.
See the <a href="#subscripts">subscripts</a> discussion, below.
<dt>(no operator)
<dd>Any two expressions placed side-by-side with no operator between them will
be concatenated as strings. C does this for literal strings, but Elvis does
it for anything.
<p>Elvis' style of concatenation is smart about whitespace.
If neither argument is an empty string, and the left argument doesn't end
with whitespace, and the right argument doesn't start with whitespace,
then Elvis will insert a single space character between them.
Otherwise it concatenates them without adding or removing any characters.
<p>If you don't want Elvis to add whitespace, use the <a href="#semi">;</a>
operator instead.
<dt>~
<dd>(tilde) Perform a bitwise NOT operation on the argument, if it is a number.
<dt>!
<dd>Return <strong>true</strong> if the argument is <strong>false</strong>
and vice versa.
<dt>* / %
<dd>The usual arithmetic operators. (% is the modulo operator.)
<p>If the first argument to * is a string instead of a number, then the second
value is used as the number of times to repeat the first argument.
<pre>
:calc "[]" * 6
[][][][][][]
</pre>
<p>Also, the / operator can be used to combine a directory name and a file name,
to form an absolute pathname.
Here are some examples showing how this works in DOS:
<pre>
:set dir home
directory=C:\temp home=C:\
:calc dir/"tempfile"
C:\temp\tempfile
:calc home/"elvis.rc"
C:\elvis.rc</pre>
<dt>+ -
<dd>The usual arithmetic operators.
Note that there is no special unary - sign; the minus sign serves double-duty.
Because C normally gives the unary - sign a higher precedence than
other operators and Elvis doesn't, you may occasionally need to enclose
negated values in parentheses to achieve the same effect.
<dt><< >>
<dd>For integers these operators perform bitwise shifting, exactly like C.
However, if the left argument is a string and the right argument is a number
then Elvis will pad or truncate the string to make its length match the
number argument.
<< pads/truncates on the right, and >> pads/truncates on the left.
<pre>
:calc "[" ; "port" << 6 ; "]"
[port ]
:calc "[" ; "starboard" >> 6 ; "]"
[rboard]</pre>
<dt><a name="relational">< <= > >= == !=</a>
<dd>Compare the arguments and return <strong>true</strong> if the comparison
holds, or <strong>false</strong> otherwise.
If both arguments look like numbers, then they will be compared as numbers;
otherwise they will be compared as strings.
<dt>&
<dd>For numbers, this returns the bitwise AND of the arguments.
For strings, it <em>may</em> perform set intersection.
See the discussion of <a href="#sets">sets</a>, below.
<dt>^
<dd>For numbers, this returns the bitwise XOR of the arguments.
For strings, it <em>may</em> perform set difference.
See the discussion of <a href="#sets">sets</a>, below.
<dt>|
<dd>For numbers, this returns the bitwise OR of the arguments.
For strings, it <em>may</em> perform set union.
See the discussion of <a href="#sets">sets</a>, below.
<dt>&&
<dd>If the left argument is <strong>false</strong>
(any of "", "0", "false", or <a href="elvisopt.html">false</a>) then return it;
else return the right argument.
Elvis differs from C in that both arguments are always evaluated.
Also, Elvis' version is more powerful since the return value isn't simply
a Boolean value.
<dt>||
<dd>If the left argument is <strong>true</strong>
(anything but "", "0", "false", or <a href="elvisopt.html#false">false</a>)
then return it;
else return the right argument.
Elvis differs from C in that both arguments are always evaluated.
right argument is only evaluated if the left argument is <strong>false</strong>.
Also, Elvis' version is more powerful since the return value isn't simply
a Boolean value.
<dt>.. ...
<dd>These two operators (dot-dot and dot-dot-dot) are identical to each other.
They both return a space-delimited list of integers between the left argument
and the right argument.
If the right argument is less than the left argument, it returns an empty
string.
<dt>?:
<dd>This one is tricky because internally Elvis always uses binary (two operand)
operators.
In C this is a ternary operator but in Elvis it is implemented as two binary
operators which cooperate in a subtle way so they seem like a single ternary
operator.
You probably don't need to know the details, but the upshot of it all is
that 1) It associates left-to-right (instead of right-to-left as in C), and
2) The <code>:</code> and third argument are optional; if omitted,
then Elvis mentally sticks <code>:""</code> on the end of the expression.
<dt>:
<dd>When <code>:</code> is used without a <code>?</code>, its behavior is
totally different.
It concatenates its arguments, with an OS-specific path delimiter between them.
On Unix systems, the delimiter is ":" but on most other systems it is ";".
This is useful when constructing values for path options such as
<a href="elvisopt.html#includepath">includepath</a> or
<a href="elvisopt.html#tags">tags</a>.
<pre>
:let includepath = includepath:home/"include"</pre>
<dt>,
<dd>(That's a comma, not an apostrophe.)
Concatenates two strings, with a comma inserted between them.
This can be handy when you're passing arguments to the <code>quote()</code>
and <code>unquote()</code> functions.
<dt><a name="semi">;</a>
<dd>Concatenates two strings without inserting any extra characters.
Note that this has a much lower precedence than <code>(no operator)</code>.
<pre>
:calc 1+2 3*4
1+2 32 32 32 3
:calc (1+2)(3*4)
3 12
:calc 1+2;3*4
312</pre>
</dl>
<h2><a name="13.2"></a><a name="FUNCTIONS"></a>13.2 Functions</h2>
There are many built-in functions.
When you call one of these functions, there must <strong>not</strong> be any
whitespace between the function name and the following parenthesis.
<p>All of these functions accept a single string as an argument.
Omitting the argument is equivalent to passing an empty string ("").
Some functions are described as taking two arguments; actually, they
take one argument and divide it at the first comma character.
<p>The built-in functions are:
<dl>
<dt><a name="absolute">absolute</a>(<var>filename</var>)
<dd>Return a full pathname for <var>filename</var>.
<dt><a name="alias">alias</a>(<var>name</var>)
<dd>Return <a href="elvisopt.html#true">true</a> if an alias exists with that
<var>name</var>, or <a href="elvisopt.html#false">false</a> otherwise.
<dt><a name="basename">basename</a>(<var>filename</var>)
<dd>Return the substring of the filename without any directory names or
extension.
For example, `<code>basename("foo/bar.c")</code>' would return "bar".
(If you want "bar.c", use the <a href="#dirfile">dirfile()</a> function.)
<dt><a name="buffer">buffer</a>(<var>bufname</var>)
<dd>Return <a href="elvisopt.html#true">true</a> if a buffer exists with that
<var>name</var>, or <a href="elvisopt.html#false">false</a> otherwise.
<dt><a name="char">char</a>(<var>number</var>)
<dd>Convert <var>number</var> to a single ASCII character, as a string.
For example, `<code>char(65)</code>' returns "A".
<dt><a name="current">current</a>(<var>item</var>)
<dd>Return a value indicating an aspect of Elvis' state.
The <var>item</var> can be any of the following:
<table cellpadding=1>
<tr><th>Item</th><th>Returned data</th></tr>
<tr><td valign=top>"line"</td>
<td>Current line number.
</td></tr>
<tr><td valign=top>"column"</td>
<td>Current column number.
</td></tr>
<tr><td valign=top>"word"</td>
<td>The word at the cursor location.
If the cursor isn't on a word, then this returns an empty string.
(Note: To get the contents of the current line,
use the <strong>line()</strong> function.)
</td></tr>
<tr><td valign=top>"wspell"</td>
<td>The spell-checker word at the cursor location.
This differs from the normal "word" in that the spell checker allows
apostrophes to appear in words if they have a letter on both sides.
</td></tr>
<tr><td valign=top>/<var>regexp</var>/</td>
<td>Text matching the <var>regexp</var> and containing the cursor.
For example, <code>current(/\S*/)</code> returns the current
whitespace-delimited word.
Note that<br><code>/</code><var>regexp</var><code>/</code> is equivalent to
<code>"/</code><var>regexp</var><code>"</code>.
</td></tr>
<tr><td valign=top>"tag"</td>
<td>If the <a href="elvisopt.html#show">show</a> option contains the keyword
"tag", then
this returns the name of the tag that is defined at the cursor location, or
the nearest one before it.
If the <code>show</code> option doesn't contain "tag", or the
cursor is located above the first tag defined in this file,
then <code>current("tag")</code> will return an empty string.
</td></tr>
<tr><td valign=top>"mode"</td>
<td>Current key parsing mode.
This returns the same string that the
<a href="elvisopt.html#showmode">showmode</a> option displays, except that this
function converts it to all lowercase, and strips out whitespace.
The usual return values are "command", "input", and "replace".
If the window isn't editing its main buffer (i.e., if you're entering
an ex command line, regular expression, or filter command) then this function
will return an empty string.
</td></tr>
<tr><td valign=top>"next"</td>
<td>Next file.
This returns the name of the file that the <a href="elvisex.html#next">:next</a>
command would load, or an empty string if you're at the end of the args list.
</td></tr>
<tr><td valign=top>"previous"</td>
<td>Previous file.
This returns the name of the file that the
<a href="elvisex.html#previous">:previous</a> command would load, or
an empty string if you're at the start of the args list.
</td></tr>
<tr><td valign=top>"face"</td>
<td>The face name (as used in the <a href="elvisex.html#color">:color</a> command) at the cursor location.
This value is only updated when the window is updated.
<tr><td valign=top>"region"</td>
<td>The current <a href="elvisex.html#REGION">region</a>'s face name.
</td></tr>
<tr><td valign=top>"rcomment"</td>
<td>The current <a href="elvisex.html#REGION">region</a>'s comment.
</td></tr>
<tr><td valign=top>"selection"</td>
<td>Visible selection type.
This returns one of "character", "rectangle", or "line" to indicate the type
of visible selection which is currently marked in the window, or
an empty string if no visible selection is marked.
</td></tr>
<tr><td valign=top>"tagstack"</td>
<td>If the window's tag stack is empty, this returns "".
Otherwise it returns the name of the buffer to which
<a href="elvisex.html#pop">:pop</a> would move the cursor.
</td></tr>
<tr><td valign=top>"background"</td>
<td>If the normal background color is known, then this returns "light" or "dark"
to describe it.
If the background is unknown (which can only happen with the
<a href="elvisgui.html#termcap">termcap</a> user interface), it returns "".
<p>
This function is different from the <a href="elvisopt.html#background">background</a>
option -- <code>current("background")</code> examines the RGB values of the
current color, while the <code>background</code> option is merely something
that you can explicitly set to "light" or "dark", independent of what the
real background color happens to be.
Note that the <a href="elvisex.html#color">:color</a> command's choices for
foreground colors is affected by the <code>background</code> option
only if <code>current("background")</code> returns "".
</td></tr>
</table>
<dt><a name="dirdir">dirdir</a>(<var>filename</var>)
<dd>Return the directory portion of the <var>filename</var>,
like <a href="#dirname">dirname()</a>.
<dt><a name="dirext">dirext</a>(<var>filename</var>)
<dd>Return the extension portion of the <var>filename</var>
(including the . character).
<dt><a name="dirfile">dirfile</a>(<var>filename</var>)
<dd>Return basename and extension portions of the <var>filename</var>.
For example, `dirfile("/usr/tmp/filename.ext")' would return "filename.ext".
<dt><a name="dirname">dirname</a>(<var>filename</var>)
<dd>Return the directory portion of the <var>filename</var>.
<dt><a name="dirperm">dirperm</a>(<var>filename</var>)
<dd>Return a string indicating the permissions on the file named
<var>filename</var>.
The possible return values are:
<table cellpadding=1>
<tr><th>Output</th><th>What it means</th></tr>
<tr><td>"invalid"</td>
<td>The argument is malformed; it could not possibly be a valid file name.</td></tr>
<tr><td>"badpath"</td>
<td>The argument is a pathname, and one or more of the directories named
in that pathname either doesn't exist or is something other than a directory.</td></tr>
<tr><td>"notfile"</td>
<td>The argument is the name of something other than a file or directory;
for example, it may be a named socket or block device.</td></tr>
<tr><td>"directory"</td>
<td> The argument is the name of a directory (folder).</td></tr>
<tr><td>"new"</td>
<td>There is no file, directory, or anything else with the given name.</td></tr>
<tr><td>"unreadable"</td>
<td>The file exists but you don't have permission to read it.</td></tr>
<tr><td>"readonly"</td>
<td>The file exists and you can read it, but you don't have permission to write
to it.</td></tr>
<tr><td>"readwrite"</td>
<td>The file exists and you can read or write it.</td></tr>
</table>
<dt><a name="elvispath">elvispath</a>(<var>filename</var>)
<dd>Search for a file named <var>filename</var> in each directory named
in the <a href="elvisopt.html#elvispath">elvispath</a> option.
Return the full pathname of the first file found, or "" if the file can't
be found in any of those directories.
<dt><a name="exists">exists</a>(<var>filename</var>)
<dd>Return <a href="elvisopt.html#true">true</a> if a file named
<var>filename</var> exists,
or <a href="elvisopt.html#false">false</a> otherwise.
<dt><a name="color">color</a>(<var>face</var>)
<br>color(<var>face</var>,"set")
<br>color(<var>face</var>,"fg")
<br>color(<var>face</var>,"bg")
<br>color(<var>face</var>,"like")
<dd>If <var>face</var> is unknown, this returns "" regardless of any other
arguments.
<p>Otherwise, when passed only a face name, it returns the attributes of that face
as set via the <a href="elvisex.html#color">:color</a> command.
When invoked with "set" as a second argument, it returns
<a href="elvisopt.html#true">true</a> or <a href="elvisopt.html#false">false</a>
to indicate whether the colors were explicitly set, or are merely the defaults.
When invoked with "fg", "bg", or "like" as a second argument,
it parses the face's description and returns that particular attribute.
<p>Note that the foreground may be a single color, or a list of colors
delimited by the word "or".
Also, in "<a href="elvisgui.html#x11">x11</a>" at least, the background
may be a single color, an XPM image file name, or both for a tinted image.
<dt><a name="feature">feature</a>(<var>name</var>)
<dd>Return <a href="elvisopt.html#true">true</a> if this version of Elvis
supports the named feature,
or <a href="elvisopt.html#false">false</a> otherwise.
Currently <code>feature()</code> returns <code>true</code> for all
supported display modes, network protocols, and certain other words;
it returns <code>false</code> for anything else.
Specifically, Elvis will return <a href="elvisopt.html#true">true</a> for
any of the following which are supported by Elvis' configuration:
<table>
<tr><th>Name</th><th>The tested feature</th></tr>
<tr><td>"alias"</td><td><a href="elvisex.html#alias">:alias</a> command</td></tr>
<tr><td>"array"</td><td><a href="#subscripts">subscripts</a> in expressions</td></tr>
<tr><td>"autocmd"</td><td><a href="elvisex.html#autocmd">:autocmd</a> and related commands</td></tr>
<tr><td>"backtick"</td><td><a href="elvisex.html#FILES">use of `<var>program</var>`</a> in ex command lines</td></tr>
<tr><td>"browse"</td><td><a href="elvisex.html#browse">:browse</a> command</td></tr>
<tr><td>"complete"</td><td><a href="elvisex.html#Tab">name completion</a> via the <Tab> key</td></tr>
<tr><td>"equaltilde"</td><td>The <a href="elvisex.html#let">:let</a> command supports "<code>=~</code> <var>excmds</var>"
<tr><td>"fold"</td><td><a href="elvisex.html#fold">:fold and :unfold</a> commands</td></tr>
<tr><td>"ftp"</td><td><a href="elvisnet.html#FTP">ftp</a> network protocol</td></tr>
<tr><td>"g"</td><td>Commands with a <a href="elvisvi.html#g">g</a> prefix</td></tr>
<tr><td>"hex"</td><td><a href="elvisdm.html#hex">hex</a> display mode</td></tr>
<tr><td>"hlobject"</td><td><a href="elvisopt.html#hlobject">hlobject</a> and <a href="elvisopt.html#hllayers">hllayers</a> options</td></tr>
<tr><td>"hlsearch"</td><td><a href="elvisopt.html#hlsearch">hlsearch</a> option</td></tr>
<tr><td>"html"</td><td><a href="elvisdm.html#html">html</a> display mode</td></tr>
<tr><td>"http"</td><td><a href="elvisnet.html#HTTP">http</a> network protocol</td></tr>
<tr><td>"image"</td><td><a href="elvisgui.html#x11.bgimage">background images</a> and themes (<a href="elvisgui.html#x11">X11</a> and <a href="elvisgui.html#windows">Windows</a>)</td></tr>
<tr><td>"incsearch"</td><td><a href="elvisopt.html#incsearch">incsearch</a> option</td></tr>
<tr><td>"listchars"</td><td>The <a href="elvisopt.html#listchars">listchars</a> option.</td></tr>
<tr><td>"lpr"</td><td><a href="elvisex.html#lpr">:lpr</a> command and <a href="elvisopt.html#LPR">printing options</a></td></tr>
<tr><td>"make"</td><td><a href="elvisex.html#make">:make</a> and related commands</td></tr>
<tr><td>"man"</td><td><a href="elvisdm.html#man">man</a> display mode</td></tr>
<tr><td>"mapdb"</td><td>map debugger, via <a href="elvisopt.html#maptrace">maptrace</a> and <a href="elvisopt.html#maplog">maplog</a> options.</td></tr>
<tr><td>"mkexrc"</td><td><a href="elvisex.html#mkexrc">:mkexrc</a> command</td></tr>
<tr><td>"normal"</td><td>Vim's <a href="elvisex.html#normal">:normal</a> command</td></tr>
<tr><td>"proto"</td><td><a href="elvistip.html#PROTO">add new protocols</a> via aliases</td></tr>
<tr><td>"ram"</td><td><a href="elvistip.html#FEATURE_RAM">-f ram</a> command-line option (mostly for MS-DOS)</td></tr>
<tr><td>"region"</td><td><a href="elvisex.html#region">:region</a> and related commands</td></tr>
<tr><td>"showtag"</td><td>The "tag" keyword in the <a href="elvisopt.html#show">show</a> option</td></tr>
<tr><td>"smartargs"</td><td><a href="elvisopt.html#smartargs">smartargs</a> option</td></tr>
<tr><td>"spell"</td><td><a href="elvistip.html#SPELL">spell checker</a></td></tr>
<tr><td>"split"</td><td><a href="elvisex.html#split">:split</a> and related commands</td></tr>
<tr><td>"stdin"</td><td>Use Elvis as filter by giving "-" as file name</td></tr>
<tr><td>"syntax"</td><td><a href="elvisdm.html#syntax">syntax</a> display mode</td></tr>
<tr><td>"tex"</td><td><a href="elvisdm.html#tex">tex</a> display mode</td></tr>
<tr><td>"textobj"</td><td><a href="elvisvi.html#textobject">text objects</a> for use with vi operators</td></tr>
<tr><td>"v"</td><td>The <a href="elvisvi.html#v">v</a>, <a href="elvisvi.html#V">V</a>, and <a href="elvisvi.html#^V">^V</a> commands</td></tr>
<tr><td>"xft"</td><td>antialiased fonts (<a href="elvisgui.html#x11">X11</a> only)</td></tr>
</table>
<p>As new features are added to future versions of Elvis,
I expect to add them to <code>feature()</code>'s list.
<dt><a name="fileeol">fileeol</a>(<var>filename</var>)
<dd>Try to guess the type of newlines used in the named file.
The list of possible return values is the same as the legal values for
the <a href="elvisopt.html#readeol">readeol</a> option.
If <var>filename</var> is an <strong>http:</strong> or <strong>ftp:</strong>
URL, then this function always returns "binary" because it would take too long
to do the real check.
If <var>filename</var> is the name of a nonexistent or unreadable file, then
it returns "text".
Otherwise, it reads the first few hundred bytes of the file and looks for
any type of newlines, or for NUL bytes suggesting it is a "binary" file.
<dt><a name="folded">folded</a>()
<br>folded(<var>number</var>)
<br>folded(<var>bufname</var>, <var>number</var>)
<br><a name="unfolded">unfolded</a>()
<br>unfolded(<var>number</var>)
<br>unfolded(<var>bufname</var>, <var>number</var>)
<dd>Return the name of the folded or unfolded "FOLD" region
containing a given line, or "" if it has never been folded.
When invoked with no arguments, it checks the current line.
When invoked with one argument, it checks that line number in the current
buffer.
Otherwise it checks the given line number within the given buffer.
<dt><a name="getcwd">getcwd</a>()
<dd>Return the name of the current working directory.
<dt><a name="hex">hex</a>(<var>number</var>)
<dd>Convert <var>number</var> to hexadecimal, and
return it as string of hex digits preceded by "0x".
<dt><a name="htmlsafe">htmlsafe</a>(<var>string</var>)
<dd>Convert all characters of <var>string</var> from ASCII to HTML.
Most characters are unaffected by this;
the only characters that are changed are "<", ">", and "&".
<dt><a name="isnumber">isnumber</a>(<var>string</var>)
<dd>Return <a href="elvisopt.html#true">true</a> if <var>string</var>
looks like a number,
or <a href="elvisopt.html#false">false</a> otherwise.
Some of the expression operators behave differently depending on whether
their arguments are numbers or strings;
this function can be used to predict which behavior the operator will employ.
<dt><a name="knownsyntax">knownsyntax</a>(<var>filename</var>)
<dd>Attempt to lookup the <var>filename</var> extension in the
<a href="elvisdm.html#elvis.syn">elvis.syn</a> file.
If found, return the name of the language;
otherwise, return an empty string.
<dt><a name="line">line</a>()
<br>line(<var>number</var>)
<br>line(<var>bufname</var>, <var>number</var>)
<dd>Return the contents of a given line.
If invoked with no arguments or with "" as the only argument,
it returns the contents of the current line of the current buffer.
If invoked with one argument, it assumes the argument is a line number in
the current buffer, and it returns that line's contents.
If invoked with two arguments, it returns the contents of the given line of
the given buffer.
For invalid input, it fails.
<dt><a name="list">list</a>(<var>string</var>)
<dd>Return a version of <var>string</var> in which any control characters
have been replaced with caret-letter sequences.
Note that unlike the <a href="elvisex.html#list">:list</a> command and
<a href="elvisopt.html#list">list</a> option, this function does <em>not</em> append
a $ to mark the end of the line
<dt><a name="newbuffer">newbuffer</a>()
<br>newbuffer(<var>bufname</var>)
<dd>This function can have the <strong>side-effect</strong> of creating a buffer.
If invoked with the name of an existing buffer, then it will leave that
buffer unchanged and return "".
If invoked with the name of a non-existing buffer, it will create that
buffer and return its name.
If invoked without any arguments, or with "" as the only argument,
it will create a buffer with a name of the form "Elvis untitled #<var>n</var>"
where <var>n</var> is an integer chosen to make the name unique.
<p>Note that the buffer is not necessarily associated with any file.
In particular, this function does not load a file's contents into the buffer.
<dt><a name="octal">octal</a>(<var>number</var>)
<dd>Convert <var>number</var> to octal, and
return it as string of octal digits preceded by "0".
<dt><a name="quote">quote</a>(<var>list</var>, <var>str</var>)
<dd>Return a version of <var>str</var> which has backslashes inserted before
any existing backslash, or before any character which appears in the
<var>list</var> argument.
For example...
<pre>
:set t="/* regexp */"
:set r="*^$/.["
:eval /(quote(r, t))/
</pre>
... will search for the next instance of the literal string
"/* regexp */".
The '/' and '*' characters won't be treated as metacharacters in the regular
expression, because the quote() function inserts backslashes before them.
<p>Quite often, the character list will simply be the
<a href="elvisopt.html#magicchar">magicchar</a> option.
This works perfectly for quoting plain text to be used in a
<a href="elvisre.html">regular expression</a>,
with the <a href="elvisopt.html#magic">magic</a> option set.
<dt><a name="rand">rand</a>(<var>number</var>)
<br>rand(<var>item ...</var>)
<dd>This function accesses a random number generator.
If passed a number, it will return a random integer between 1 and that number.
Any other argument is interpreted as a comma-delimited list of values; it will
randomly choose one item and return it.
<pre>
:calc rand(6)
2
:calc rand(6)
5
:calc rand("north", "south", "east", "west")
north
:calc rand("north,south,east,west")
east</pre>
<p>
(If you want to choose from a list with some other type of delimiter,
you can use an <a href="#subscripts">array subscript</a> of "?".)
<dt><a name="shell">shell</a>(<var>program</var>)
<dd>Run program, and return its output (i.e., the text that it writes to
stdout).
The final newline, if any, is removed.
If the output is too large to fit in Elvis' evaluation buffer, then it will
be truncated.
Generally, it is a good idea to limit the output to a single line.
<p>The following example will fetch the computer's name,
by running the Unix "uname" program:
<pre>
:let n = shell("uname -n")</pre>
<dt><a name="spell">spell</a>(<var>string</var>)
<br><a name="spelltag">spelltag</a>(<var>string</var>)
<dd><var>String</var> is a single word.
If it appears to be correctly spelled, then <code>spell()</code>
or <code>spelltag()</code> returns "".
Otherwise, it returns a space-delimited list of possible corrected spellings.
If no corrected spellings are found, then it returns "?".
<p>The <code>spelltag()</code> function looks up words via the tags dictionary,
while <code>spell()</code> uses both the tags and natural-language dictionaries.
These only find words that have been loaded into RAM, however.
This includes all tags so the <code>spelltag()</code> function should work well,
but Elvis only loads natural-language words the first time it displays
them on the screen.
This will often prevent <code>spell()</code> from finding the corrected word.
You can use the <a href="elvisex.html#wordfile">:wordfile</a> command
or <a href="elvisopt.html#spellautoload">spellautoload</a> option to load
all of the natural-language words into RAM, so <code>spell()</code> will work
better.
<dt><a name="strlen">strlen</a>(<var>string</var>)
<dd>Return the number of characters in <var>string</var>.
<dt><a name="time">time</a>()
<br>time(<var>filename</var>)
<dd>When invoked without any arguments, or an empty string as an argument,
it returns the current time.
When given the name of a file, it returns the timestamp of that file;
if the file doesn't exist or is invalid, then an empty string is returned.
Time strings are always of the form
"<var>YYYY</var>-<var>MM</var>-<var>DD</var>T<var>hh</var>:<var>mm</var>:<var>ss</var>"
where the timezone is understood to be local time zone.
This is an ISO-8660 compliant date format.
Two timestamps can be compared as strings, using Elvis' normal
<a href="#relational">relational operators</a>.
<dt><a name="tolower">tolower</a>(<var>string</var>)
<dd>Return a lowercase version of <var>string</var>.
<dt><a name="toupper">toupper</a>(<var>string</var>)
<dd>Return an uppercase version of <var>string</var>.
<dt><a name="unquote">unquote</a>(<var>list</var>, <var>str</var>)
<dd>Return a version of <var>str</var>,
after removing backslashes before another backslash or
any characters in <var>list</var>.
This is the opposite of the <a href="#quote">quote()</a> function.
<dt><a name="window">window</a>(<var>buffer</var>)
<dd>Return the <a href="elvisopt.html#windowid">windowid</a> of a window
that is currently showing <var>buffer</var>, or "" if there is no such window.
(See also the <a href="elvisex.html#window">:window</a> command for a way to
switch windows.)
</dl>
<h2><a name="13.3"></a><a name="subscripts"></a>13.3 Subscripts</h2>
Elvis can be compiled with support for subscripts in expressions.
To determine whether your version of Elvis supports this, you can
check the value returned by <a href="#feature">feature("array")</a>.
If <code>True</code> then subscripts should work.
<h3>13.3.1 Extracting substrings</h3>
<p>Subscripts offer a way to extract parts of a string.
By default it divides the string into words.
By placing index numbers in square brackets at the end of a string expression,
you can extract the indexed words.
<pre>
:let a="this is a test"
:calc a[1]
this
:calc a[2 3 4]
is a test</pre>
<p>Note that subscripts start 1, not 0 as in C.
Positive subscripts count from the left edge of the string, and
negative subscripts count from the right edge.
Zero returns the number of items in the string.
<pre>
:calc a[-1]
test
:calc a[0]
4</pre>
<p>Using "?" in the subscript chooses an element randomly.
<pre>
:calc a["?"]
is</pre>
<p>You aren't limited to a single index number.
You can use a space-delimited list of elements to extract.
The ".." operator is handy for this.
An empty list extracts an empty string.
<pre>
:calc a[1..3]
this is a
:calc a[2..]
is a test
:calc a[]
:calc a[4 3 2 1]
test a is this
:calc a["?????"]
this a test a is
:calc a["?."]
a test</pre>
<p>Although the subscripting works on space-delimited words by default,
it can also use any single-character delimiter.
Simply pass the delimiter inside the square brackets, before the index values.
<pre>
:calc "/var/tmp/myfile"["/", 2]
var
:calc "/var/tmp/myfile"["/", -1]
myfile</pre>
<p>Notice that the text before the first instance of the delimiter
(a zero-length string in the above examples) counts as item #1, so
"var" is actually the second item in that string.
<p>You can index by individual characters.
This is denoted by giving an empty string as the delimiter.
<pre>
:calc a["",1..6]
This i
:calc a["",7..]
s a test</pre>
<h3>13.3.2 Changing substrings</h3>
<p>The <a href="elvisex.html#let">:let</a> command also allows you to use
subscripts to change the value of <em>part</em> of an option's value.
<pre>
:let a[2] = "has been"
:calc a
this has been a test
:calc a[0]
5</pre>
<p>There are some limitations on what subscripts you can use for assignments.
You can't change the length by assigning to subscript [0] for example.
The replaced text must be contiguous, not scattered around the string.
You also can't change an element which doesn't exist yet.
<pre>
:let a[0] = 3
invalid subscript for assignment
:let a[2 4] = "foo"
invalid subscript for assignment
:let a[6] = "dude!"
invalid subscript for assignment</pre>
<p>Remember, this may look like you're using arrays but it is really just
string processing.
If you want to add a new item to a string, use a concatenation operator.
<pre>
:let a = a "dude!"
:calc a
this has been a test dude!
:calc a[0]
6
:let a["", 3 4] = "at"
:calc a
that has been a test dude!</pre>
<h3>13.3.3 <a name="fields">Field names as subscripts</a></h3>
<p>The subscript string can be a field name instead of a list of subscript
numbers.
Field names can be any alphanumeric strings that start with a letter.
When you do this, Elvis will look for a comma-delimited item which begins
with the field name followed by a ':' character.
The remainder of the item is then used as the value.
<pre>
:let n = "first:1,last:2"
:calc n["first"]
1
:let n["first"] = "Steve"
:calc n
first:Steve,last:2</pre>
<p>For field names that are constant strings, you can also use <code>.</code><var>name</var>
notation.
<pre>
:calc n.first
Steve
:let n.last = "Kirkendall"
:calc n
first:Steve,last:Kirkendall</pre>
<p>In a command of the form
"<code>:let </code><var>option.name</var><code>=</code><var>value</var>",
if the <var>option</var> doesn't already contain a field with the given
<var>name</var>, then Elvis will append it.
<p>It is also worth noting that the
<a href="elvisopt.html#listchars">listchars</a> option uses this format.
Consequently, you can use named subscripts to access its fields.
<pre>
:let listchars.esc="<Esc>"</pre>
<h3>13.3.4 Subscript idioms</h3>
<p>There are some tricks you can use to simplify the way you specify a delimiter.
First, since any empty expression returns an empty string, you can leave off
the "" (but retain the comma) when indexing by characters.
<pre>
:calc a[,1..4]
that</pre>
<p>Next, many punctuation characters are used as arithmetic operators, and
many arithmetic operators will concatenate strings with a copy of the operator
between them, if either of their arguments isn't a number.
This means that you can sometimes avoid quoting operators.
<pre>
:calc "*-courier-medium-r-*-18-*"[-,-2]
18
:calc "Portland|Oregon|97201"[|,1]
Portland</pre>
<p>Some other operators do interesting and useful things.
For example, the <code>/</code> operator concatenates strings using the
operating system's directory delimiter, and the <code>:</code> operator
concatenates them with the path delimiter.
This means that unquoted <code>/</code> and <code>:</code> can be used
to pick apart file names and directory paths in an OS-independent manner.
<pre>
:calc filename
C:\tmp\filename.txt
:calc filename[/,-1]
filename.txt
:calc $PATH
C:\windows;C:\windows\command;C:\msdev\bin
:calc $PATH[:,1]
C:\windows</pre>
<p>Here is an <em>incomplete</em> table summarizing some of these idioms:
<pre graphic>
.--------.-------------------------------------------.
| Idiom | What it returns |
|--------|-------------------------------------------|
| a[i] | The i'th word |
| a[,i] | The i'th character |
| a[,,i] | The i'th comma-delimited item |
| a[/,i] | The i'th part of a filename |
| a[:,i] | The i'th element in a directory path list |
^--------^-------------------------------------------^</pre>
<h3><a name="sets">13.3.5 Sets</a></h3>
If <a href="#feature">feature("array")</a> returns <code>True</code>,
then Elvis also supports sets.
Sets are represented as comma-delimited lists of <var>name</var>s or
<var>name</var>:<var>value</var> pairs.
<p>
This format is very similar to the way Elvis uses field names as subscripts,
and that's why sets are supported only when arrays are supported.
This similarity means you can test whether a given element is in a set
by using an expression of the form <var>set</var>.<var>fieldname</var>,
like this:
<pre>
:let a="red:255,green:150,blue:0,allocated,private"
:calc a.red
255
:calc a.alpha
:calc a.allocated
True</pre>
<p>Note that elements that are present but have no value will return
the value of the <a href="elvisopt.html#true">true</a> option, but missing
elements will simply return ""
(not <a href="elvisopt.html#false">false</a>, although "" is treated as a false
value in Boolean contexts such as an <a href="elvisex.html#if">:if</a> command).
Elements with values will return their value.
<p>The <strong>&</strong>, <strong>|</strong>, and <strong>^</strong>
operators will perform set intersection, union, and difference, respectively,
when passed non-numeric arguments.
Specifically...
<dl>
<dt><var>leftset</var> & <var>rightset</var>
<dd>
The return value is the <strong>intersection</strong> of the sets.
The <var>value</var> components from <var>rightset</var> are kept.
<pre>
:calc 2345 & 0xff
41
:calc "a,b,c" & "a,c,e"
a,c
:calc "foo:1,bar:true" & "foo"
foo
:calc "foo" & "foo:1,bar:true"
foo:1</pre>
<dt><var>leftset</var> ^ <var>rightset</var>
<dd>
The return value is the <strong>difference</strong> of the sets.
In other words, the result consists of any elements from <var>leftset</var>
which don't also appear in <var>rightset</var>.
The <var>value</var> components from <var>leftset</var> are kept.
<pre>
:calc "a,b,c" ^ "b"
a,c
:calc "a:1,b:2,c:3" ^ "b:don't care"
a:1,c:3
:set listchars?
listchars=trail:_,tab:>-
:let listchars ^= "trail"
:set listchars?
listchars=tab:>-</pre>
<dt><var>leftset</var> | <var>rightset</var>
<dd>
The return value is the <strong>union</strong> of the sets.
For <var>name</var>:<var>value</var> pairs that appear in both arguments,
the <var>value</var> components from <var>rightset</var> are kept.
<pre>
:calc "a,b,c" | "a,c,e"
a,b,c,e
:calc "a:1,b:2,c:3" | "b:two,d:four"
a:1,b:two,c:3,d:four
:calc listchars?
listchars=tab:>-
:let listchars |= "trail:_"
:calc listchars?
listchars=tab:>-,trail:_</pre>
</dl>
Notice that set operators can be handy for manipulating the
<a href="elvisopt.html#listchars">listchars</a> option.
They can also be useful if you pack multiple fields into the
<a href="elvisopt.html#bb">bb</a> and <a href="elvisopt.html#ww">ww</a>
options.
<p>If both argument sets are sorted, then the resulting set from any of
the operators will also be sorted.
The <a href="elvistip.html#theme">:theme</a> alias uses the following code
to build a sorted list of available themes.
Since the set of themes starts out empty (which is inherently sorted),
and we only add single elements at a time (which are also inherently sorted),
this means the list of themes will be sorted.
<pre>
local a="" i d f
for i (1..elvispath[:,0])
do {
let d=elvispath[:,i]
for f in (d/"themes"/"*.ex")
do {
if basename(f) != "*"
then let a |= basename(f)
}
}
if a == ""
then error no themes
else calc a</pre>
<p>The real magic happens in the "<code>:let a |= basename(f)</code>" command,
which adds an item to the set, while avoiding duplicates and keeping the set
sorted.
<h2><a name="13.4"></a><a name="SIMPLER"></a>13.4 Simpler Syntax</h2>
In comparison to the <a href="#13.1">normal</a> expression syntax,
the simpler syntax makes it easier to enter literal strings because
outside of parentheses the only special characters are the backslash,
dollar sign, and parentheses.
(These may be escaped by preceding them with a backslash.)
Inside parentheses, the normal syntax is used.
<p>The <a href="elvisex.html#eval">:eval</a> command uses the simpler syntax,
and the <a href="elvisex.html#echo">:echo</a> command displays its arguments.
These commands can be used together to experiment with the simpler syntax,
the same way we used <a href="elvisex.html#calculate">:calculate</a> to experiment with
the normal syntax.
<pre>
:eval echo TERM=$TERM
TERM=xterm
:eval echo home=(home)
home=/home/steve
:eval echo 2+2=(2+2)
2+2=4
</pre>
<h2><a name="13.5"></a>13.5 EX Commands Which Use Expressions</h2>
The <a href="elvisex.html#calculate">:calculate</a> command evaluates its
argument using the normal syntax, and displays the result.
<p>The <a href="elvisex.html#if">:if</a> command evaluates its argument using
the normal syntax.
If the resulting value is any Boolean <strong>true</strong> value then a
flag is set; otherwise the flag is reset.
After that, you can use <a href="elvisex.html#then">:then</a> and
<a href="elvisex.html#else">:else</a> commands to conditionally execute some
commands, depending on the state of that flag.
<p>The <a href="elvisex.html#while">:while</a> command defines the expression
that is to be tested by a later <a href="elvisex.html#do">:do</a> command.
The <a href="elvisex.html#for">:for</a> command, on the other hand,
can evaluate its argument immediately and use the result as a list of values
to be used by <a href="elvisex.html#do">:do</a>.
<p>The <a href="elvisex.html#eval">:eval</a> command evaluates its arguments
using the simpler syntax.
The resulting string value is then interpreted as an EX command line.
This gives you a way to use the expression evaluator with commands which
otherwise wouldn't evaluate expressions.
<p>The <a href="elvisex.html#let">:let</a> command allows you to change the
values of options.
Its syntax is "<code>:let <var>option</var>=<var>expression</var></code>",
where <var>expression</var> is any expression using the normal syntax.
You can use this to change the value of any unlocked option,
similarly to <a href="elvisex.html#set">:set.</a>
<pre>
:set i=14
:calc i
14
:let i=i+1
:set i?
i=15
:eval set i=(i*2)
:calc i
30
:let elvispath="."
:let list="false"
:let sidescroll=0x10
</pre>
<h2><a name="13.6"></a>13.6 VI Commands Which Use Expressions</h2>
There is only one way to use expressions in a visual command:
Move the cursor to the start of some expression in your edit buffer,
hit the lowercase <kbd>v</kbd> key, move to the other end, and
then hit the <kbd>=</kbd> key.
Elvis will then evaluate the highlighted expression, and replace the original
expression with the result.
<p>Note that the <a href="elvisvi.html#=">=</a> operator only works this way
when used with the <a href="elvisvi.html#v">v</a> command for marking characters.
If you visibly mark lines, or use the traditional <kbd>=</kbd><var>movement</var>
syntax, then Elvis will send the selected lines though the external filter
program named in the <a href="elvisopt.html#equalprg">equalprg</a> option.
<p>The <a href="elvisvi.html#hash">#</a> command doesn't use expressions, but
it does perform some simple math.
<h2><a name="13.7"></a>13.7 Other Uses of Expressions</h2>
<h3>13.6.1 Messages</h3>
All of Elvis' warning and error messages are actually expressions,
using the simpler syntax.
When outputting a message, Elvis may supply other parameters which are
accessible as <strong>$1</strong> through <strong>$9.</strong>
See the <a href="elvismsg.html">Messages</a> chapter for a longer description
of how Elvis handles messages.
<h3>13.6.2 Options</h3>
The <a href="elvisopt.html#ccprg">ccprg</a> and
<a href="elvisopt.html#makeprg">makeprg</a> options' values are expressions,
using the simpler syntax.
When evaluating these expressions, <strong>$1</strong> is replaced by
whatever arguments are supplied on the ex command line, and <strong>$2</strong> is replaced by the
the name of the file being edited.
<p>Similarly, the <a href="elvisopt.html#keywordprg">keywordprg</a> option
uses the simpler syntax with
<strong>$1</strong> being replaced by the name of a tag to be looked up, and
<strong>$2</strong> by the current file name.
<p>The <a href="elvisopt.html#tagprg">tagprg</a> option, if set, replaces $1
with the arguments of the <a href="elvisex.html#tag">:tag</a> command --
generally the name of the tag to be looked up, although the user is free to
type in anything.
<h3>13.6.3 File Names</h3>
File names are evaluated as expressions (using the simpler syntax),
primarily as a means for expanding environment variable names.
This is done prior to wildcard expansion.
<p>The full power of the expression evaluator is available; you can use
it to do more than just expand environment variable names.
For example, you could store the name of a file in one of the user
options, and then later use that option name in parentheses wherever
a filename was expected.
<pre>
:set f=myfile.txt
:w (f)
wrote myfile.txt, ...
</pre>
<p>If you use this trick, remember that it only works when Elvis is expecting
a file name.
It won't work when invoking external programs, because Elvis doesn't know
which program arguments are supposed to be file names.
Elvis always passes program arguments literally.
<p>Recall that when a backslash character is followed by an alphanumeric
character, both the backslash and the alphanumeric character become part
of the resulting value.
This was done mostly for the benefit of file names.
If the backslash was always dropped
then MS-DOS users would have a heck of a time entering pathnames of files!
By making the backslash a little smarter, we avoid that problem.
<pre>
:eval echo c:\tmp \(notice the backslashes\)
c:\tmp (notice the backslashes)</pre>
<p>To simplify the task of writing portable ex scripts,
the behavior of the <strong>/</strong> operator has been extended.
When one or both of its arguments are strings, it concatenates them as
a directory name and a file name, yielding a full pathname.
<h3>13.6.4 Buffer names</h3>
Ex commands allow you to specify a buffer name by putting its name in
parentheses.
You can have Elvis compute a buffer name by putting '=' and an expression
inside parentheses.
For example, if option <a href="elvisopt.html#x">x</a> is set to "foo"
then "<code>:(=x)%p</code>" is equivalent to "<code>:(foo)%p</code>".
Both commands would print the contents of the "foo" buffer.
<p>This feature was added because using <code>:eval</code> to evaluate buffer
names was cumbersome.
The parentheses have special meaning in both expressions and ex addresses,
and <code>:eval</code> affects parentheses and backslashes throughout the line,
not just in the buffer name.
The following example demonstrates the two techniques, deleting any backspace
sequences in the buffer whose name is stored in option <strong>x</strong>.
Clearly, the "<code>:(=x)</code>" version is smaller and easier to understand.
<pre>
:eval \((x)\)%s/.\\b\\\(.\\\)/\\1/g
:(=x)%s/.\b\(.\)/\1/g</pre>
</body></html>
|