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

[RFC] cmdline mode autocommands #7422

Merged
merged 1 commit into from Nov 22, 2017

Conversation

Projects
None yet
9 participants
@bfredl
Member

bfredl commented Oct 21, 2017

Define autocommands CmdlineEnter and CmdlineLeavefor entering and leaving cmdline mode. This will be very useful for inccommand-style plugins, ref #7370.

Note, I changed my mind since #4399, ModeChange does not make much sense as nvim is not a "finite state machine" in the named modes, rather a stack machine (proof: what happens when <c-r>= in cmdline? and <cr> right after that?). But what could make sense is generic ModeEnter and ModeLeave as suggesed by @ZyX-I #7416 (comment) . But I'm not entirely sure how to structure v:event then, I like that cmdline status is readily accessible in v:event without nesting. An alternative could of course be to put detailed info in cmdline_info() function (more detailed than getcmdtype(), it would then also be accessible in timers, "cmdline changed" callbacks: only colors now but callbacks for inccommand will follow, and also cmdline window)

Error propagation in CmdlineLeave is a bit weird, it typically executes the command but aborts processing some time soon after, probably errors should be echoed but not affect further processing at all.

@marvim marvim added the WIP label Oct 21, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 6c3fda1 to 32f7c48 Oct 21, 2017

@chrisbra

This comment has been minimized.

@bfredl

This comment has been minimized.

Member

bfredl commented Oct 21, 2017

@chrisbra @brammool

augroup TEST
  au!
  au CmdLineLeave * echoerr "FAIL!"
augroup END

map ,x :let g:x = "x"<cr>:let g:y = "y"<cr>

Is it intentional that when invoking ,x and CmdlineLeave raises an error, that command line is still executed, but any later processing is aborted, i e g:x get set but not g:y ? Even though it was the g:x cmdline that raised the error? I would have expected both or none would be executed.

@ZyX-I

This comment has been minimized.

Contributor

ZyX-I commented Oct 21, 2017

For “not affecting further processing” I had to design try_enter/try_leave pair currently used while doing cmdline highlighting.

@brammool

This comment has been minimized.

brammool commented Oct 21, 2017

The error in CmdlineLeave does not affect executing commands.
It causes the mapping to be aborted.

@brammool

This comment has been minimized.

brammool commented Oct 21, 2017

We can make an error in CmdlineLeave stop execution of the command line, that seems to make sense. Not sure what to do with an error in CmdlineError, let's leave it alone for now.

@brammool

This comment has been minimized.

brammool commented Oct 21, 2017

Hmm, after trying this out, there is a serious flaw: If the CmdlineLeave autocmds fail, there is no way to execute any command. That includes removing the autocommand. So let's NOT do this.

@bfredl

This comment has been minimized.

Member

bfredl commented Oct 21, 2017

I agree, but then I think the mapping shouldn't be aborted either. Because it is even less related to the autocmd than the :-command...

@brammool

This comment has been minimized.

brammool commented Oct 21, 2017

@bfredl

This comment has been minimized.

Member

bfredl commented Oct 22, 2017

I wonder whether this is because it is somehow the "right" thing to do, or just because the vim codebase makes it hard to do otherwise. If I understand @ZyX-I correctly before he introduced try_enter/try_leave there was no reliable, reusable logic to do this.

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch 2 times, most recently from bd45183 to 96575d6 Oct 22, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 96575d6 to b6925e7 Oct 29, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from b6925e7 to f27106f Oct 31, 2017

@bfredl bfredl changed the title from [WIP] cmdline mode autocommands to [RFC] cmdline mode autocommands Oct 31, 2017

@bfredl

This comment has been minimized.

Member

bfredl commented Oct 31, 2017

Marking RFC. I went for color_cmdline style error handling. Errors in autocmd should not abort unrelated commands/mappings. let v:event.aborting = 1 works to do it explicitly. (but not the other way around, trying to un-abort something already aborted seems like a can of worms not to open).

@marvim marvim added RFC and removed WIP labels Oct 31, 2017

@justinmk justinmk added this to the 0.2.2 milestone Oct 31, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch 3 times, most recently from 8f2cc68 to 9c24ed6 Oct 31, 2017

@osa1

This comment has been minimized.

Contributor

osa1 commented Nov 1, 2017

What is the status of this?

@bfredl

This comment has been minimized.

Member

bfredl commented Nov 1, 2017

The is currently some discussion upstream vim/vim#2263 about the semantics of these events, we should probably wait until it is resolved. It can wait until 0.2.1 is released, let's not hurry.

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 9c24ed6 to 1e2e02d Nov 10, 2017

@justinmk justinmk modified the milestones: 0.2.2, 0.2.3 Nov 13, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 1e2e02d to 24611e0 Nov 19, 2017

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 24611e0 to 0592593 Nov 19, 2017

@bfredl

This comment has been minimized.

Member

bfredl commented Nov 19, 2017

@justinmk Actually, the only reason this got delayed was waiting for vim/vim#2263 to get a resolution, but it seems the resolution implicitly was to "do nothing" (which anyway was the proper "resolution" IMO). The v:event part is already properly tested and documented so I see little reason to break this PR in two. But I removed some superfluous keys.

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch 2 times, most recently from 7ab2767 to 9ccc42a Nov 19, 2017

@justinmk

This comment has been minimized.

Member

justinmk commented Nov 20, 2017

@bfredl instead of "aborting" how about "cancel" or "canceled"? Otherwise LGTM.

@bfredl

This comment has been minimized.

Member

bfredl commented Nov 21, 2017

"abort*" seems to be more common than "cancel*" for stopping a command/function/mode (as) if an error/interrupt occured. How is "cancel" better?

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 9ccc42a to 9aa8421 Nov 21, 2017

@justinmk

This comment has been minimized.

Member

justinmk commented Nov 21, 2017

@bfredl "cancel" is more common in UI event systems that I know of (javascript, .NET winforms). I associate "aborting" with a program exit, etc.

@@ -1527,16 +1527,21 @@ v:event Dictionary of event data for the current |autocommand|. Valid
< Keys vary by event; see the documentation for the specific
event, e.g. |DirChanged| or |TextYankPost|.
KEY DESCRIPTION ~
abort whether the event triggered during
an aborting contidion, i e |c_Esc| or

This comment has been minimized.

@KillTheMule

KillTheMule Nov 21, 2017

Contributor

Typo.

@bfredl

This comment has been minimized.

Member

bfredl commented Nov 21, 2017

@justinmk I would indeed associate cancel with specifically user/UI initiated stopping, like pressing CTRL-C in cmdline. But vim seems to use "abort" most often when the condition is generic, i e could be either internal/vimL error, user interrupt or some kind of edge case which is not necessarily an error but the command/mode/action should not be completed.

If this key was only ever used for CmdlineLeave I would be inclined to agree with you, as CTRL-C likely is the most common cause in this case. But if keys are as I recall supposed to be generic for future events, which can have very different dynamics, I think v:event.abort is better.

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch 3 times, most recently from cf730fa to 0293f2f Nov 21, 2017

cmdline: CmdlineEnter and CmdlineLeave autocommands
vim-patch:fafcf0dd59fd

patch 8.0.1206: no autocmd for entering or leaving the command line

Problem:    No autocmd for entering or leaving the command line.
Solution:   Add CmdlineEnter and CmdlineLeave.

vim/vim@fafcf0d

@bfredl bfredl force-pushed the bfredl:cmdlineenter branch from 0293f2f to b461eb5 Nov 22, 2017

@bfredl bfredl merged commit a4f6cec into neovim:master Nov 22, 2017

0 of 3 checks passed

QuickBuild Build pr-7422 finished with status FAILED
Details
continuous-integration/appveyor/pr Waiting for AppVeyor build to complete
Details
continuous-integration/travis-ci/pr The Travis CI build is in progress
Details

@jszakmeister jszakmeister removed the RFC label Nov 22, 2017

@@ -1167,6 +1167,8 @@ EXTERN char_u e_dirnotf[] INIT(= N_(
EXTERN char_u e_unsupportedoption[] INIT(= N_("E519: Option not supported"));
EXTERN char_u e_fnametoolong[] INIT(= N_("E856: Filename too long"));
EXTERN char_u e_float_as_string[] INIT(= N_("E806: using Float as a String"));
EXTERN char_u e_autocmd_err[] INIT(=N_(
"E920: autocmd has thrown an exception: %s"));

This comment has been minimized.

@justinmk

justinmk Nov 22, 2017

Member

@bfredl This should be in the 5000+ range. 920 in Vim is channel-related.

This comment has been minimized.

@bfredl

bfredl Nov 22, 2017

Member

It used to be our range. (Jobstart etc) Or did we change our channel errors to be the in the same range as vim channel errors?

This comment has been minimized.

@justinmk

justinmk Nov 22, 2017

Member

Ah, if you chose it for reason, so be it. No big deal.

Or did we change our channel errors to be the in the same range as vim channel errors?

I meant that Vim uses error 920. We don't, until now.

This comment has been minimized.

@bfredl

bfredl Nov 22, 2017

Member

Feel free to change it. But how do we know the other nvim specific codes in 900 won't collide? Or did vim-dev avoid individual numbers in 900 if not the entire range?

This comment has been minimized.

@justinmk

justinmk Nov 22, 2017

Member

@bfredl That's why we started using the 5000+ range, to avoid collisions.

This comment has been minimized.

@bfredl

bfredl Nov 22, 2017

Member

I meant the existing numbers. Do we know/assume that vim-dev won't use them, or should they be changed before nvim 1.0?

This comment has been minimized.

@justinmk

justinmk Nov 22, 2017

Member

They should be changed. In most cases probably just prepending a 5 should work.

bfredl added a commit that referenced this pull request Nov 23, 2017

justinmk added a commit that referenced this pull request Jun 11, 2018

NVIM v0.3.0
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment