diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-07-19 18:42:22 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-07-19 18:42:22 +1000 |
| commit | 56a5dc66ff37e02f92c93b7f77e2de58ef98ef4d (patch) | |
| tree | bc494e3c09c4967af4ff7d64895396aa5629a1e1 /src | |
| parent | d640c321c05c8dc0f4af200a5f56f1bc37376001 (diff) | |
| parent | 5543a4d58cb5ac0b052221e063df584f087b6924 (diff) | |
Merge remote-tracking branch 'lenormf/kill-clients-exit-code'
Diffstat (limited to 'src')
| -rw-r--r-- | src/commands.cc | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/commands.cc b/src/commands.cc index 2c6bdd33..2d21bb63 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -434,30 +434,44 @@ static void ensure_all_buffers_are_saved() throw runtime_error(message); } +template<bool force> +void kill(const ParametersParser& parser, Context& context, const ShellContext&) +{ + auto& client_manager = ClientManager::instance(); + + if (not force and client_manager.count() == 1) + ensure_all_buffers_are_saved(); + + const int status = parser.positional_count() > 0 ? str_to_int(parser[0]) : 0; + while (not client_manager.empty()) + client_manager.remove_client(**client_manager.begin(), true, status); + + throw kill_session{}; +} + const CommandDesc kill_cmd = { "kill", nullptr, - "kill current session, quit all clients and server", - no_params, + "kill [exit_code]: terminate the current session, the server and all clients connected" + "; the given integer will be used as exit code by the server and client processes", + { {}, ParameterDesc::Flags::SwitchesAsPositional, 0, 1 }, CommandFlags::None, CommandHelper{}, CommandCompleter{}, - [](const ParametersParser&, Context&, const ShellContext&){ - ensure_all_buffers_are_saved(); - throw kill_session{}; - } + kill<false> }; const CommandDesc force_kill_cmd = { "kill!", nullptr, - "kill current session, quit all clients and server, do not check for unsaved buffers", - no_params, + "kill [exit_code]: force the termination of the current session, the server and all clients connected" + "; the given integer will be used as exit code by the server and client processes", + { {}, ParameterDesc::Flags::SwitchesAsPositional, 0, 1 }, CommandFlags::None, CommandHelper{}, CommandCompleter{}, - [](const ParametersParser&, Context&, const ShellContext&){ throw kill_session{}; } + kill<true> }; template<bool force> |
