diff options
| author | Maxime Coste <mawww@kakoune.org> | 2019-04-08 22:16:44 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2019-04-08 22:16:44 +1000 |
| commit | 675dbfbe8bcf70a74cdb6dcc71e4d194137e9c0f (patch) | |
| tree | 3405fde28146d311b036b79631ddb51ef10ef081 /src | |
| parent | c8839e79041ef37849a4cb8ac5017eadc8ec9653 (diff) | |
Auto generate buffer name when using edit -scratch with no name
This will make it easier to create a temporary scratch buffer to
work in without having troubles with name collisions.
Fixes #849
Diffstat (limited to 'src')
| -rw-r--r-- | src/commands.cc | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/src/commands.cc b/src/commands.cc index f1e2b71a..ef597f6f 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -322,34 +322,48 @@ struct CommandDesc template<bool force_reload> void edit(const ParametersParser& parser, Context& context, const ShellContext&) { - if (parser.positional_count() == 0 and not force_reload) + if (parser.positional_count() == 0 and + not force_reload and + not parser.get_switch("scratch")) throw wrong_argument_count(); - auto& name = parser.positional_count() > 0 ? parser[0] - : context.buffer().name(); - auto& buffer_manager = BufferManager::instance(); - - Buffer* buffer = buffer_manager.get_buffer_ifp(name); const bool no_hooks = context.hooks_disabled(); const auto flags = (no_hooks ? Buffer::Flags::NoHooks : Buffer::Flags::None) | (parser.get_switch("debug") ? Buffer::Flags::Debug : Buffer::Flags::None); - if (force_reload and buffer and buffer->flags() & Buffer::Flags::File) - reload_file_buffer(*buffer); - else + auto& buffer_manager = BufferManager::instance(); + if (parser.get_switch("scratch")) { - if (parser.get_switch("scratch")) + if (parser.get_switch("readonly") or parser.get_switch("fifo") or parser.get_switch("scroll")) + throw runtime_error("scratch is not compatible with readonly, fifo or scroll"); + + String name; + if (parser.positional_count() > 0) + name = parser[0]; + else { - if (buffer and (force_reload or buffer->flags() != Buffer::Flags::None)) + for (int i = 0; true; ++i) { - buffer_manager.delete_buffer(*buffer); - buffer = nullptr; + name = format("*scratch-{}*", i); + if (buffer_manager.get_buffer_ifp(name) == nullptr) + break; } - - if (not buffer) - buffer = buffer_manager.create_buffer(name, flags); } - else if (auto fifo = parser.get_switch("fifo")) + + Buffer* buffer = buffer_manager.create_buffer(std::move(name), flags); + context.change_buffer(*buffer); + return; + } + + auto& name = parser.positional_count() > 0 ? parser[0] + : context.buffer().name(); + Buffer* buffer = buffer_manager.get_buffer_ifp(name); + + if (force_reload and buffer and buffer->flags() & Buffer::Flags::File) + reload_file_buffer(*buffer); + else + { + if (auto fifo = parser.get_switch("fifo")) buffer = open_fifo(name, *fifo, flags, (bool)parser.get_switch("scroll")); else if (not buffer) { |
