summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-08-14 23:51:24 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-08-14 23:51:24 +0100
commitceb10665d1f76f6ad8a9360d2cb70176baa9e889 (patch)
tree68cf66eca21e6de2c5bee5e2e5559827bed700ca
parent05887808665b0e18a076079be93a8a7acf1b06bd (diff)
Add support for running kakoune as a filter, using -f 'keys'
It will cycle on every given files, apply the keys and write to <filename>.kak-out. Only normal/insert mode is available, kakrc are not read.
-rw-r--r--src/event_manager.cc6
-rw-r--r--src/face_registry.hh4
-rw-r--r--src/main.cc41
-rw-r--r--src/normal.cc3
4 files changed, 50 insertions, 4 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc
index 9a51b885..152791ad 100644
--- a/src/event_manager.cc
+++ b/src/event_manager.cc
@@ -19,12 +19,14 @@ FDWatcher::~FDWatcher()
Timer::Timer(TimePoint date, Callback callback)
: m_date{date}, m_callback{std::move(callback)}
{
- EventManager::instance().m_timers.insert(this);
+ if (EventManager::has_instance())
+ EventManager::instance().m_timers.insert(this);
}
Timer::~Timer()
{
- EventManager::instance().m_timers.erase(this);
+ if (EventManager::has_instance())
+ EventManager::instance().m_timers.erase(this);
}
void Timer::run()
diff --git a/src/face_registry.hh b/src/face_registry.hh
index 08ceed49..80a30ffc 100644
--- a/src/face_registry.hh
+++ b/src/face_registry.hh
@@ -27,7 +27,9 @@ private:
inline Face get_face(const String& facedesc)
{
- return FaceRegistry::instance()[facedesc];
+ if (FaceRegistry::has_instance())
+ return FaceRegistry::instance()[facedesc];
+ return Face{};
}
}
diff --git a/src/main.cc b/src/main.cc
index c24c8b07..81430fed 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -385,6 +385,36 @@ int run_server(StringView session, StringView init_command,
return 0;
}
+int run_filter(StringView keystr, memoryview<StringView> files)
+{
+ GlobalOptions global_options;
+ GlobalHooks global_hooks;
+ GlobalKeymaps global_keymaps;
+ ShellManager shell_manager;
+ BufferManager buffer_manager;
+ RegisterManager register_manager;
+
+ register_env_vars();
+ register_registers();
+
+ auto keys = parse_keys(keystr);
+
+ for (auto& file : files)
+ {
+ Buffer* buffer = create_buffer_from_file(file);
+ InputHandler input_handler{{ *buffer, Selection{} }};
+
+ for (auto& key : keys)
+ input_handler.handle_key(key);
+
+ write_buffer_to_file(*buffer, file + ".kak-out");
+
+ buffer_manager.delete_buffer(*buffer);
+ }
+ buffer_manager.clear_buffer_trash();
+ return 0;
+}
+
int run_pipe(StringView session)
{
char buf[512];
@@ -424,6 +454,14 @@ int kakoune(const ParametersParser& parser)
}
return run_pipe(parser.option_value("p"));
}
+ else if (parser.has_option("f"))
+ {
+ std::vector<StringView> files;
+ for (size_t i = 0; i < parser.positional_count(); ++i)
+ files.emplace_back(parser[i]);
+
+ return run_filter(parser.option_value("f"), files);
+ }
String init_command;
if (parser.has_option("e"))
@@ -476,7 +514,8 @@ int main(int argc, char* argv[])
{ "n", { false, "do not source kakrc files on startup" } },
{ "s", { true, "set session name" } },
{ "d", { false, "run as a headless session (requires -s)" } },
- { "p", { true, "just send stdin as commands to the given session" } } }
+ { "p", { true, "just send stdin as commands to the given session" } },
+ { "f", { true, "act as a filter, executing given keys on given files" } } }
};
try
{
diff --git a/src/normal.cc b/src/normal.cc
index 04aef5e3..34428a1a 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -341,6 +341,9 @@ void for_each_char(Context& context, int)
void command(Context& context, int)
{
+ if (not CommandManager::has_instance())
+ return;
+
context.input_handler().prompt(
":", "", get_face("Prompt"),
std::bind(&CommandManager::complete, &CommandManager::instance(), _1, _2, _3, _4),