Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

startup: treat stdin as text instead of commands #7679

Merged
merged 12 commits into from
Jun 10, 2018
Merged

Conversation

justinmk
Copy link
Member

@justinmk justinmk commented Dec 3, 2017

Motivation

  • Execution of input is (1) almost always unintentional/confusing, and (2) potentially destructive.
  • Avoids the need for time-delayed warning. Use isatty #7659
  • The common case is to open text in a buffer, not send commands.

Concepts

Treat stdin as input by default (so the "-" file is not needed):

echo foo | nvim

It works even if file args are given:

echo foo | nvim file1.txt file2.txt

It also works with -Es (but not -es), useful for scripts:

echo foo | nvim -Es +"%print" +"q!"

When you want to execute Normal-mode commands, use -s - instead:

echo ifoo | nvim -s - 

Other alternatives for executing commands:

  • Replay a register. E.g. the following mostly works, except @q aborts on any "beep" (e.g. if the cursor can't move).
    nvim -c '%d q|norm @q' -
    
  • Future: Let :%source work with unsaved buffer contents?

closes #2087
closes #7659

Todo/Notes

@justinmk
Copy link
Member Author

justinmk commented Dec 3, 2017

I just remembered (happily) that @ZyX-I already worked on the -s - feature in #6299 . @ZyX-I is that still WIP? What's needed to get it merged?

@ZyX-I
Copy link
Contributor

ZyX-I commented Dec 3, 2017

AFAIR only AppVeyor hang.

@justinmk justinmk force-pushed the stdin branch 4 times, most recently from 806c0b9 to aa8a618 Compare May 21, 2018 23:56
@justinmk justinmk added enhancement feature request ux user experience labels May 22, 2018
@justinmk justinmk added this to the 0.3 milestone May 22, 2018
@justinmk justinmk changed the title startup: non-tty stdin implies "-" file startup: treat stdin as input instead of commands May 22, 2018
@justinmk justinmk force-pushed the stdin branch 4 times, most recently from 94712a4 to 1b68794 Compare May 25, 2018 07:14
@justinmk justinmk changed the title startup: treat stdin as input instead of commands startup: treat stdin as text instead of commands May 25, 2018
@justinmk justinmk force-pushed the stdin branch 3 times, most recently from 299cb5f to 521fbe5 Compare May 29, 2018 18:05
justinmk added a commit to justinmk/neovim that referenced this pull request May 29, 2018
Fixes 2 failing tests in startup_spec.lua.

The Windows-only `--literal` option complicates support of "stdin-as-text
+ file-args" (neovim#7679).  Could work around it, but it's not worth
the trouble:
- users have a reasonable (and englightening) alternative: nvim +"n *"
- "always literal" is more consistent/predictable
- avoids platform-specific special-case

Unrelated changes:
- Replace fileno(stdxx) with STDXX_FILENO for consistency (not motivated
  by any observed technical reason).
justinmk added a commit to justinmk/neovim that referenced this pull request May 29, 2018
Fixes 2 failing tests in startup_spec.lua.

The Windows-only `--literal` option complicates support of "stdin-as-text
+ file-args" (neovim#7679).  Could work around it, but it's not worth
the trouble:
- users have a reasonable (and englightening) alternative: nvim +"n *"
- "always literal" is more consistent/predictable
- avoids platform-specific special-case

Unrelated changes:
- Replace fileno(stdxx) with STDXX_FILENO for consistency (not motivated
  by any observed technical reason).
justinmk added a commit to justinmk/neovim that referenced this pull request May 29, 2018
Fixes 2 failing tests in startup_spec.lua.

The Windows-only `--literal` option complicates support of "stdin-as-text
+ file-args" (neovim#7679).  Could work around it, but it's not worth
the trouble:
- users have a reasonable (and englightening) alternative: nvim +"n *"
- "always literal" is more consistent/predictable
- avoids platform-specific special-case

Unrelated changes:
- Replace fileno(stdxx) with STDXX_FILENO for consistency (not motivated
  by any observed technical reason).
justinmk added a commit to justinmk/neovim that referenced this pull request May 30, 2018
Fixes 2 failing tests in startup_spec.lua.

The Windows-only `--literal` option complicates support of "stdin-as-text
+ file-args" (neovim#7679).  Could work around it, but it's not worth
the trouble:
- users have a reasonable (and englightening) alternative: nvim +"n *"
- "always literal" is more consistent/predictable
- avoids platform-specific special-case

Unrelated changes:
- Replace fileno(stdxx) with STDXX_FILENO for consistency (not motivated
  by any observed technical reason).
This code was essentially dead because this condition:
    (!parmp->err_isatty && (!parmp->output_isatty || !parmp->input_isatty))
is almost never true.

ref neovim#7659
Treat stdin as text by default (so the "-" file is not needed):
    echo foo | nvim

It works with file args (implemented in next commit), too:
    echo foo | nvim file1.txt file2.txt

Why? Because:
- Execution of input is (1) almost always unintentional/confusing,
  and (2) potentially destructive.
- Avoids the need for time-delayed warning.  neovim#7659
- The _common_ case is to open text in a buffer, not send commands.

Note:
- Not for Ex-mode (-es) because it is used by scripts.  But maybe `-Es`?
- Not for --headless, because stdio may be a protocol stream and may be
  used for any purpose by stdioopen().

To treat stdin as Normal-mode commands, use `-s -` instead:
    echo ifoo | nvim -s -
Other alternatives:
  - Replay a register. E.g. the following mostly works, except @q aborts
    on any "beep" (e.g. if the cursor can't move).
    nvim -c '%d q|norm @q' -
  - Future: Let `:%source` work with unsaved buffer contents?

closes neovim#2087
closes neovim#7659
Special-case for -E/-Es (as opposed to -e/-es).

-es/-Es is the only mode that really allows N/Vim to work as a batch
script engine.  Adding a new flag (say `-x`) would involve a lot of
churn: -es/-Es is implemented by checking `exmode_active` in numerous
places.

This commit does not change -es because some scripts use it. But scripts
are unlikely to use -Es because it is not functionally different from
-es.

Also, both -es and -Es were broken in Nvim for years and no one
mentioned it...
silent-mode (AKA batch-mode, -es/-Es) by definition should not behave
like a UI.

There are still some places that check `full_screen` to decide behavior,
e.g. msg_start().  Future: maybe eliminate `full_screen`, check
`ui_active()` instead?
silent-mode (-es/-Es) has been broken for years.  The workaround up to
now was to include --headless.  But --headless is not equivalent because
it prints all messages, not the limited subset defined by silent-mode.
Fixes 2 failing tests in startup_spec.lua.

The Windows-only `--literal` option complicates support of "stdin-as-text
+ file-args" (neovim#7679).  Could work around it, but it's not worth
the trouble:
- users have a reasonable (and englightening) alternative: nvim +"n *"
- "always literal" is more consistent/predictable
- avoids platform-specific special-case

Unrelated changes:
- Replace fileno(stdxx) with STDXX_FILENO for consistency (not motivated
  by any observed technical reason).
@justinmk justinmk merged commit b836328 into neovim:master Jun 10, 2018
@justinmk justinmk deleted the stdin branch June 10, 2018 13:11
justinmk added a commit that referenced this pull request Jun 11, 2018
FEATURES:
3cc7ebf #7234 built-in VimL expression parser
6a7c904 #4419 implement <Cmd> key to invoke command in any mode
b836328 #7679 'startup: treat stdin as text instead of commands'
58b210e :digraphs : highlight with hl-SpecialKey #2690
7a13611 #8276 'startup: Let `-s -` read from stdin'
1e71978 events: VimSuspend, VimResume #8280
1e7d5e8 #6272 'stdpath()'
f96d99a #8247 server: introduce --listen
e8c39f7 #8226 insert-mode: interpret unmapped META as ESC
98e7112 msg: do not scroll entire screen (#8088)
f72630b #8055 let negative 'writedelay' show all redraws
5d2dd2e win: has("wsl") on Windows Subsystem for Linux #7330
a4f6cec cmdline: CmdlineEnter and CmdlineLeave autocommands (#7422)
207b7ca #6844 channels: support buffered output and bytes sockets/stdio

API:
f85cbea #7917 API: buffer updates
418abfc #6743 API: list information about all channels/jobs.
36b2e3f #8375 API: nvim_get_commands
273d2cd #8329 API: Make nvim_set_option() update `:verbose set …`
8d40b36 #8371 API: more reliable/descriptive VimL errors
ebb1acb #8353 API: nvim_call_dict_function
9f994bb #8004 API: nvim_list_uis
3405704 #7520 API/UI: forward option updates to UIs
911b1e4 #7821 API: improve nvim_command_output

WINDOWS OS:
9cefd83 #8084, #8516 build/win: support MSVC
ee4e1fd win: Fix reading content from stdin (#8267)

TUI:
ffb8904 #8309 TUI: add support for mouse release events in urxvt
8d5a46e #8081 TUI: implement "standout" attribute
6071637 TUI: support TERM=konsole-256color
67848c0 #7653 TUI: report TUI info with -V3 ('verbose' >= 3)
3d0ee17 TUI/rxvt: enable focus-reporting
d109f56 #7640 TUI: 'term' option: reflect effective terminal behavior

FIXES:
ed6a113 #8273 'job-control: avoid kill-timer race'
4e02f1a #8107 'jobs: separate process-group'
451c48a terminal: flush vterm output buffer on pty output #8486
5d6732f :checkhealth fixes #8335
53f11dc #8218 'Fix errors reported by PVS'
d05712f inccommand: pause :terminal redraws (#8307)
51af911 inccommand: do not execute trailing commands #8256
84359a4 terminal: resize to the max dimensions (#8249)
d49c1dd #8228 Make vim_fgets() return the same values as in Vim
60e96a4 screen: winhl=Normal:Background should not override syntax (#8093)
0c59ac1 #5908 'shada: Also save numbered marks'
ba87a2c cscope: ignore EINTR while reading the prompt (#8079)
b1412dc #7971 ':terminal Enter/Leave should not increment jumplist'
3a5721e TUI: libtermkey: force CSI driver for mouse input #7948
6ff13d7 #7720 TUI: faster startup
1c6e956 #7862 TUI: fix resize-related segfaults
a58c909 #7676 TUI: always hide cursor when flushing, never flush buffers during unibilium output
303e1df #7624 TUI: disable BCE almost always
249bdb0 #7761 mark: Make sure that jumplist item will not have zero lnum
6f41ce0 #7704 macOS: Set $LANG based on the system locale
a043899 #7633 'Retry fgets on EINTR'

CHANGES:
ad60927 #8304 default to 'nofsync'
f3f1970 #8035 defaults: 'fillchars'
a6052c7 #7984 defaults: sidescroll=1
b69fa86 #7888 defaults: enable cscopeverbose
7c4bb23 defaults: do :filetype stuff unless explicitly "off"
2aa308c #5658 'Apply :lmap in macros'
8ce6393 terminal: Leave 'relativenumber' alone (#8360)
e46534b #4486 refactor: Remove maxmem, maxmemtot options
131aad9 win: defaults: 'shellcmdflag', 'shellxquote' #7343
c57d315 #8031 jobwait(): return -2 on interrupt also with timeout
6452831 clipboard: macOS: fallback to tmux if pbcopy is broken #7940
300d365 #7919 Make 'langnoremap' apply directly after a map
ada1956 #7880 'lua/executor: Remove lightuserdata'

INTERNAL:
de0a954 #7806 internal statistics for list impl
dee78a4 #7708 rewrite internal list impl
@justinmk justinmk mentioned this pull request Jun 24, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement feature request ux user experience
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Use isatty Make reading from stdin more intuitive
2 participants