summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-04-08 22:16:44 +1000
committerMaxime Coste <mawww@kakoune.org>2019-04-08 22:16:44 +1000
commit675dbfbe8bcf70a74cdb6dcc71e4d194137e9c0f (patch)
tree3405fde28146d311b036b79631ddb51ef10ef081 /src
parentc8839e79041ef37849a4cb8ac5017eadc8ec9653 (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.cc48
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)
{