-
-
Notifications
You must be signed in to change notification settings - Fork 6.3k
[RFC] cmdline mode autocommands #7422
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
Conversation
Is it intentional that when invoking |
For “not affecting further processing” I had to design try_enter/try_leave pair currently used while doing cmdline highlighting. |
The error in CmdlineLeave does not affect executing commands. |
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. |
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. |
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... |
Björn Linse wrote:
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...
Every error aborts a mapping. Would be inconsistent not to do that
here.
…--
ARTHUR: Then who is your lord?
WOMAN: We don't have a lord.
ARTHUR: What?
DENNIS: I told you. We're an anarcho-syndicalist commune. We take it in
turns to act as a sort of executive officer for the week.
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
|
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. |
bd45183
to
96575d6
Compare
Marking RFC. I went for color_cmdline style error handling. Errors in autocmd should not abort unrelated commands/mappings. |
8f2cc68
to
9c24ed6
Compare
What is the status of this? |
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. |
@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 |
7ab2767
to
9ccc42a
Compare
@bfredl instead of "aborting" how about "cancel" or "canceled"? Otherwise LGTM. |
"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 "cancel" is more common in UI event systems that I know of (javascript, .NET winforms). I associate "aborting" with a program exit, etc. |
runtime/doc/eval.txt
Outdated
@@ -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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo.
@justinmk I would indeed associate If this key was only ever used for |
cf730fa
to
0293f2f
Compare
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
@@ -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")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bfredl This should be in the 5000+ range. 920 in Vim is channel-related.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bfredl That's why we started using the 5000+ range, to avoid collisions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
They should be changed. In most cases probably just prepending a 5
should work.
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
Define autocommands
CmdlineEnter
andCmdlineLeave
for 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 genericModeEnter
andModeLeave
as suggesed by @ZyX-I #7416 (comment) . But I'm not entirely sure how to structurev:event
then, I like that cmdline status is readily accessible inv:event
without nesting. An alternative could of course be to put detailed info incmdline_info()
function (more detailed thangetcmdtype()
, 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.