• R/O
  • SSH
  • HTTPS

yash: Commit


Commit MetaInfo

Revision3850 (tree)
Time2018-08-22 23:45:17
Authormagicant

Log Message

Define prompt with $YASH_PSxy variables

The interpretation of the $PSxy variables differs depending on whether
the shell is in the POSIXly-correct mode or not. If the user switches
the mode on or off, the variables had to be redefined to match the new
interpretation. The shell now allows using the $YASH_PSxy variables
instead of $PSxy for defining prompt strings. As $YASH_PSxy are not used
in the POSIXly-correct mode, the user can define $PSxy to have different
values than $YASH_PSxy.

$PS1 is now always initialized to "$ " or "# ", as was only in the
POSIXly-correct mode. This default prompt works both in and out of the
POSIXly-correct mode.

Note: For backward compatibility with old initialization scripts which
only define $PSx to override the default prompt strings, we should not
initialize YASH_PSx by default.

Change Summary

Incremental Difference

--- yash/trunk/NEWS (revision 3849)
+++ yash/trunk/NEWS (revision 3850)
@@ -10,7 +10,12 @@
1010 ----------------------------------------------------------------------
1111 Yash 2.48
1212
13+ + The prompt string now can be defined with the $YASH_PS...
14+ variables.
15+ = The default value of $PS1 has been changed.
1316 . Updated the sample initialization script (yashrc):
17+ = The prompt strings are now defined with the $YASH_PS...
18+ variables.
1419 * Window title update should now work on more terminals.
1520 * Any predefined handlers for SIGTSTP, SIGTTIN, and SIGTTOU are
1621 now cancelled so that jobs can be suspended properly.
--- yash/trunk/doc/ja/posix.txt (revision 3849)
+++ yash/trunk/doc/ja/posix.txt (revision 3850)
@@ -30,7 +30,7 @@
3030 - link:exec.html#search[コマンドの検索]においてlink:builtin.html#types[通常の組込みコマンド]は対応する外部コマンドがないと見つかりません。
3131 - いくつかのlink:builtin.html[組込みコマンド]で特定のオプションが使えなくなるなど挙動が変わります。
3232 - link:interact.html[対話モード]でないとき、link:builtin.html#types[特殊組込みコマンド]のオプションやオペランドの使い方が間違っているとシェルは直ちに終了します。また特殊組込みコマンドで代入エラーやリダイレクトエラーが発生したときも直ちに終了します。
33-- link:interact.html[対話モード]のプロンプトを出す前に link:params.html#sv-prompt_command[+PROMPT_COMMAND+ 変数]の値を実行しません。link:params.html#sv-ps1[+PS1+ 変数]・link:params.html#sv-ps2[+PS2+ 変数]・link:params.html#sv-ps4[+PS4+ 変数]の値の解釈の仕方が違います。
33+- link:interact.html[対話モード]のプロンプトを出す前に link:params.html#sv-prompt_command[+PROMPT_COMMAND+ 変数]の値を実行しません。link:params.html#sv-ps1[+PS1+ 変数]・link:params.html#sv-ps2[+PS2+ 変数]・link:params.html#sv-ps4[+PS4+ 変数]の値の解釈の仕方が違います。link:params.html#sv-yash_ps1[+YASH_PS1+] など +YASH_+ で始まる名前のプロンプト変数は使用されません。
3434 - link:interact.html#mailcheck[メールチェック]において、ファイルが更新されている場合はファイルが空でも新着メールメッセージを出力します。
3535
3636 // vim: set filetype=asciidoc expandtab:
--- yash/trunk/doc/ja/interact.txt (revision 3849)
+++ yash/trunk/doc/ja/interact.txt (revision 3850)
@@ -95,6 +95,8 @@
9595
9696 また、プロンプトのフォントだけでなく、入力するコマンドのフォントを変えることもできます。link:params.html#sv-ps1s[+PS1S+] (または link:params.html#sv-ps2s[+PS2S+]) 変数に上述のフォントを指定するシーケンスを指定することで、コマンド入力時のコマンドのフォントが変わります。
9797
98+link:posix.html[POSIX 準拠モード]でないときは、上記の変数は名前に +YASH_+ を付けた名前 (例えば link:params.html#sv-yash_ps1[+YASH_PS1+]) で定義することもできます。これにより、POSIX 準拠モードとは異なるプロンプトを使い分けることができます。
99+
98100 link:posix.html[POSIX 準拠モード]でないときは、プロンプトを出す前に link:params.html#sv-prompt_command[+PROMPT_COMMAND+ 変数]の値がコマンドとして実行されます。
99101
100102 [[history]]
--- yash/trunk/doc/ja/params.txt (revision 3849)
+++ yash/trunk/doc/ja/params.txt (revision 3850)
@@ -177,7 +177,7 @@
177177 [[sv-ps1]]+PS1+::
178178 この変数の値は、対話モードのシェルが出力する標準のコマンドプロンプトを指定します。この値の書式についてはlink:interact.html#prompt[プロンプト]の項を参照してください。
179179 +
180-この変数はシェルの起動時に +\$ + に初期化されます。(link:posix.html[POSIX 準拠モード] なら実効ユーザ ID が 0 かどうかによって +$ + と +# + のどちらか)
180+この変数はシェルの起動時に実効ユーザ ID が 0 かどうかによって +$ + と +# + のどちらかに初期化されます。
181181
182182 [[sv-ps1r]]+PS1R+::
183183 この変数の値は、対話モードのシェルがコマンドを読み込む際に、入力されるコマンドの右側に表示されるプロンプトを指定します。この値の書式についてはlink:interact.html#prompt[プロンプト]の項を参照してください。
@@ -230,6 +230,16 @@
230230 [[sv-yash_le_timeout]]+YASH_LE_TIMEOUT+::
231231 この変数はlink:lineedit.html[行編集]機能で曖昧な文字シーケンスが入力されたときに、入力文字を確定させるためにシェルが待つ時間をミリ秒単位で指定します。行編集を行う際にこの変数が存在しなければ、デフォルトとして 100 ミリ秒が指定されます。
232232
233+[[sv-yash_ps1]]+YASH_PS1+::
234+[[sv-yash_ps1r]]+YASH_PS1R+::
235+[[sv-yash_ps1s]]+YASH_PS1S+::
236+[[sv-yash_ps2]]+YASH_PS2+::
237+[[sv-yash_ps2r]]+YASH_PS2R+::
238+[[sv-yash_ps2s]]+YASH_PS2S+::
239+[[sv-yash_ps4]]+YASH_PS4+::
240+[[sv-yash_ps4s]]+YASH_PS4S+::
241+link:posix.html[POSIX 準拠モード]ではないとき、これらの変数は名前に +YASH_+ が付かない +PS1+ 等の変数の代わりに優先して使われます。POSIX 準拠モードではこれらの変数は無視されます。link:interact.html#prompt[プロンプト]で yash 固有の記法を使用する場合はこれらの変数を使用すると POSIX 準拠モードで yash 固有の記法が解釈されずに表示が乱れるのを避けることができます。
242+
233243 [[sv-yash_version]]+YASH_VERSION+::
234244 この変数はシェルの起動時にシェルのバージョン番号に初期化されます。
235245
--- yash/trunk/doc/posix.txt (revision 3849)
+++ yash/trunk/doc/posix.txt (revision 3850)
@@ -80,6 +80,8 @@
8080 The values of the link:params.html#sv-ps1[+PS1+],
8181 link:params.html#sv-ps2[+PS2+], and link:params.html#sv-ps4[+PS4+] variables
8282 are parsed differently.
83+ Prompt variables with a +YASH_+ prefix (e.g.
84+ link:params.html#sv-yash_ps1[+YASH_PS1+]) are not used.
8385 - In link:interact.html#mailcheck[mail checking], a notification message is
8486 printed if the file has been modified, regardless of whether the file is
8587 empty.
--- yash/trunk/doc/interact.txt (revision 3849)
+++ yash/trunk/doc/interact.txt (revision 3850)
@@ -169,6 +169,11 @@
169169 link:params.html#sv-ps1[+PS1+] and link:params.html#sv-ps2[+PS2+] variables.
170170 The value can contain the +\f{{fontspecs}}.+ notation only.
171171
172+When the shell is not in the link:posix.html[POSIXly-correct mode], the prompt
173+variables can be defined with a name prefixed with +YASH_+ (e.g.
174+link:params.html#sv-yash_ps1[+YASH_PS1+]). This allows using a different
175+prompt string than that in the POSIXly-correct mode.
176+
172177 When the shell is not in the link:posix.html[POSIXly-correct mode],
173178 the value of the link:params.html#sv-prompt_command[+PROMPT_COMMAND+ variable]
174179 is executed before each prompt.
--- yash/trunk/doc/params.txt (revision 3849)
+++ yash/trunk/doc/params.txt (revision 3850)
@@ -307,10 +307,8 @@
307307 This variable specifies the main command prompt string printed by an
308308 link:interact.html[interactive] shell.
309309 See link:interact.html#prompt[Prompts] for the format of the variable value.
310-The value is initialized to +\$ + when the shell is started.
311-(In the link:posix.html[POSIXly-correct mode], the initial value is either
312-+$ + or +# + depending on whether the effective user ID of the shell
313-process is zero or not.)
310+The value is initialized to either +$ + or +# + depending on whether
311+the effective user ID of the shell process is zero or not.
314312
315313 [[sv-ps1r]]+PS1R+::
316314 This variable specifies the auxiliary prompt string printed to the right of
@@ -406,6 +404,22 @@
406404 If you do not define this variable, the default value of 100 milliseconds is
407405 assumed.
408406
407+[[sv-yash_ps1]]+YASH_PS1+::
408+[[sv-yash_ps1r]]+YASH_PS1R+::
409+[[sv-yash_ps1s]]+YASH_PS1S+::
410+[[sv-yash_ps2]]+YASH_PS2+::
411+[[sv-yash_ps2r]]+YASH_PS2R+::
412+[[sv-yash_ps2s]]+YASH_PS2S+::
413+[[sv-yash_ps4]]+YASH_PS4+::
414+[[sv-yash_ps4s]]+YASH_PS4S+::
415+When not in the link:posix.html[POSIXly-correct mode], if any of these
416+variables is defined, it takes precedence over the corresponding variable
417+without the +YASH_+ prefix in the name (e.g. +PS1+).
418+These variables are ignored in the POSIXly-correct mode.
419+You should define them to include yash-specific notations in the
420+link:interact.html#prompt[prompt], so that unhandled notations do not mangle
421+the prompt in the POSIXly-correct mode.
422+
409423 [[sv-yash_version]]+YASH_VERSION+::
410424 The value is initialized to the version number of the shell
411425 when the shell is started.
--- yash/trunk/variable.c (revision 3849)
+++ yash/trunk/variable.c (revision 3850)
@@ -302,8 +302,7 @@
302302
303303 /* set $PS1~4 */
304304 {
305- const wchar_t *ps1 =
306- !posixly_correct ? L"\\$ " : (geteuid() != 0) ? L"$ " : L"# ";
305+ const wchar_t *ps1 = (geteuid() != 0) ? L"$ " : L"# ";
307306 set_variable(L VAR_PS1, xwcsdup(ps1), SCOPE_GLOBAL, false);
308307 set_variable(L VAR_PS2, xwcsdup(L"> "), SCOPE_GLOBAL, false);
309308 set_variable(L VAR_PS4, xwcsdup(L"+ "), SCOPE_GLOBAL, false);
--- yash/trunk/input.c (revision 3849)
+++ yash/trunk/input.c (revision 3850)
@@ -1,6 +1,6 @@
11 /* Yash: yet another shell */
22 /* input.c: functions for input of command line */
3-/* (C) 2007-2017 magicant */
3+/* (C) 2007-2018 magicant */
44
55 /* This program is free software: you can redistribute it and/or modify
66 * it under the terms of the GNU General Public License as published by
@@ -51,6 +51,10 @@
5151 #endif
5252
5353
54+static wchar_t *expand_prompt_variable(wchar_t num, wchar_t suffix)
55+ __attribute__((malloc,warn_unused_result));
56+static const wchar_t *get_prompt_variable(wchar_t num, wchar_t suffix)
57+ __attribute__((pure));
5458 static wchar_t *expand_ps1_posix(wchar_t *s)
5559 __attribute__((nonnull,malloc,warn_unused_result));
5660 static inline wchar_t get_euid_marker(void)
@@ -249,22 +253,16 @@
249253 struct promptset_T get_prompt(int type)
250254 {
251255 struct promptset_T result;
252- wchar_t name[5] = { L'P', L'S', L'\0', L'\0', L'\0' };
253256
257+ wchar_t num;
254258 switch (type) {
255- case 1: name[2] = L'1'; break;
256- case 2: name[2] = L'2'; break;
257- case 4: name[2] = L'4'; break;
259+ case 1: num = L'1'; break;
260+ case 2: num = L'2'; break;
261+ case 4: num = L'4'; break;
258262 default: assert(false);
259263 }
260264
261- const wchar_t *ps = getvar(name);
262- if (ps == NULL)
263- ps = L"";
264-
265- wchar_t *prompt = parse_and_expand_string(ps, gt("prompt"), false);
266- if (prompt == NULL)
267- prompt = xwcsdup(L"");
265+ wchar_t *prompt = expand_prompt_variable(num, L'\0');
268266 if (posixly_correct) {
269267 if (type == 1)
270268 result.main = expand_ps1_posix(prompt);
@@ -275,27 +273,43 @@
275273 result.styler = xwcsdup(L"");
276274 } else {
277275 result.main = prompt;
276+ result.right = expand_prompt_variable(num, L'R');
277+ result.styler = expand_prompt_variable(num, L'S');
278+ }
278279
279- name[3] = L'R';
280- ps = getvar(name);
281- if (ps == NULL)
282- ps = L"";
283- prompt = parse_and_expand_string(ps, gt("prompt"), false);
284- if (prompt == NULL)
285- prompt = xwcsdup(L"");
286- result.right = prompt;
280+ return result;
281+}
287282
288- name[3] = L'S';
289- ps = getvar(name);
290- if (ps == NULL)
291- ps = L"";
292- prompt = parse_and_expand_string(ps, gt("prompt"), false);
293- if (prompt == NULL)
294- prompt = xwcsdup(L"");
295- result.styler = prompt;
283+/* Expands the result of `get_prompt_variable' for a prompt.
284+ * The result is a newly-malloced string. */
285+wchar_t *expand_prompt_variable(wchar_t num, wchar_t suffix)
286+{
287+ const wchar_t *var = get_prompt_variable(num, suffix);
288+ wchar_t *expanded = parse_and_expand_string(var, gt("prompt"), false);
289+ return expanded != NULL ? expanded : xwcsdup(L"");
290+}
291+
292+/* Returns the value of the variable "YASH_PSxy", where x is `num' and y is
293+ * `suffix'. If it is unset or the shell is in the POSIXly-correct mode, returns
294+ * the value of "PSxy". If it is also unset, returns an empty string. */
295+const wchar_t *get_prompt_variable(wchar_t num, wchar_t suffix)
296+{
297+ wchar_t name[] = L"YASH_PS\0\0";
298+ name[7] = num;
299+ name[8] = suffix;
300+
301+ const wchar_t *value;
302+ if (!posixly_correct) {
303+ value = getvar(name);
304+ if (value != NULL)
305+ return value;
296306 }
297307
298- return result;
308+ value = getvar(&name[5]);
309+ if (value != NULL)
310+ return value;
311+
312+ return L"";
299313 }
300314
301315 /* Expands the contents of the PS1 variable in the posixly correct way.
Show on old repository browser