Вот несколько экспериментов, чтобы продемонстрировать, как |
, <Bar>
и \|
ведут себя в различных сценариях в командах Vim.
Приведенные ниже кодовые блоки показывают несколько команд Vim с каждой командой (или набор команд) с последующим кратким комментарием о поведении команды.
Случай 1: Команды оболочки
:!uname | new
/bin/bash: new: command not found
:!uname <Bar> new
/bin/bash: Bar: no such file or directory
:!uname \| new
usage: uname [-amnprsv]
:!uname | grep i
Darwin
Выводы:
|
передается как литерал |
в оболочку. <Bar>
передается как литерал <Bar>
перенаправлению ввода / вывода. \|
передается как литерал |
в оболочку.
Таким образом, в этом случае все три команды ведут себя одинаково, в том смысле, что вы видите то, что передается в оболочку.Так что это легко понять.
Случай 2: Пользовательские команды для команд оболочки
:command! A !uname | new
:A
/bin/bash: new: command not found
:command! A !uname <Bar> new
:A
/bin/bash: new: command not found
:command! A !uname \| new
:A
usage: uname [-amnprsv]
:command! A !uname | grep i
:A
Darwin
:command! A !uname <Bar> grep i
:A
Darwin
Выводы:
|
и <Bar>
ведут себя аналогично (передаются как |
в оболочку). \|
ведут себя по-разному (передаются как литерал \|
в оболочку).
Случай 3: Карты дляКоманды оболочки
:map ,a :!uname | new<CR>
,a
Creates a new window when the `:map` command is executed.
Enters `!uname` in the command-line-mode when `,a` is pressed.
:map ,a :!uname <Bar> new
,a
Enters `:!uname | new` in the command mode.
:map ,a :!uname \| new
,a
Enters `:!uname | new` in the command mode.
Выводы:
|
ведет себя по-разному (разделитель команд между :map
и другой командой Vim, в данном случае new
). <Bar>
и \|
ведут себя аналогично (они становятся |
при выполнении map-rhs).
Случай 4: команды Vim, принимающие аргументы
:new | vnew
Creates split windows
:new <Bar> vnew
Creates a single split window with file named `<Bar> vnew`
:new \| vnew
Creates a single split window with file named `| vnew`
Выводы:
|
ведет себя по-разному (как разделитель команд). \|
и <Bar>
ведут себя аналогично (как буквальный аргумент).
Случай 5: пользовательские команды для команд Vim, которые принимают аргументы.
:command! A new | vnew
:A
Creates split windows.
:command! A new <Bar> vnew
:A
Creates split windows
:command! A new \| vnew
:A
Creates a single split window with file named `| vnew`
Выводы
|
и <Bar>
ведут себя аналогично(в качестве разделителей команд во время выполнения команды). \|
ведет себя по-разному (как буквальный аргумент для new
во время выполнения команды).
Это согласуется с вариантом 2 выше.
Пример 6. Карты для команд Vim, принимающих аргументы.
:map ,a :new | vnew
,a
Creates a new window when the `:map` command is executed.
Enters `new` in the command-line-mode when `,a` is pressed.
:map ,a :new <Bar> vnew
,a
Enters `:new | vnew` in the command-line-mode when `,a` is pressed.
:map ,a :new \| vnew
,a
Enters `:new | vnew` in the command-line-mode when `,a` is pressed.
Выводы:
|
ведет себя по-разному (разделитель команд между :map
идругая команда Vim, new
в данном случае). <Bar>
и \|
ведут себя аналогично (они становятся |
при выполнении map-rhs)
Это согласуется с делом 3 выше.Это имеет смысл, потому что этот случай по сути такой же, как и в случае 2, т. Е. :map
для переназначения нажатий клавиш для команд режима командной строки.
Случай 7: команды Vim, которые не принимают аргументы
:bn | bn
Goes to the 2nd next buffer.
:bn <Bar> bn
E488: Trailing characters
:bn \| bn
Goes to the 1st next buffer. What happened to `\| bn`?!
Выводы:
- Все три из
|
, <Bar>
и \|
ведут себя по-разному.
Случай 8: пользователь-определенные команды для команд Vim, которые не принимают аргументы.
:command! A bn | bn
:A
Goes to the 2nd next buffer.
:command! A bn <Bar> bn
:A
Goes to the 2nd next buffer.
:command! A bn \| bn
:A
Goes to the 1st next buffer.
Выводы: - |
и <Bar>
ведут себя аналогично (как разделители команд во время выполнения команды).- \|
ведет себя так, как если бы \|
буквально использовался как \|
в bn \| bn
, что приводит к сбивающему с толку поведению, как показано в предыдущем случае.
Это поведение согласуется с делом 2 и делом 5.
Случай 9: карты для команд Vim, которые не принимают аргументы.
:map ,a :bn | bn
,a
Switches to the next buffer when `:map` command is executed.
Enters `:bn` in the command-line-mode.
:map ,a :bn <Bar> bn
,a
Enters `:bn | bn` in the command-line-mode.
:map ,a :bn \| bn
,a
Enters `:bn | bn` in the command-line-mode
Это согласуется с вариантами 3 и 6 выше.
Мой вопрос
Каковы окончательные правила (согласно авторитетной документации или справке Vim) в отношении того, как |
, <Bar>
и \|
интерпретируются в различных командах, принимая настройки по умолчанию Vim (по умолчанию cpoptions
, обычный * 1149)* и :command
команды и т. д.)?