summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.adoc9
-rw-r--r--sdn.cpp27
2 files changed, 27 insertions, 9 deletions
diff --git a/README.adoc b/README.adoc
index 18f922a..dd4e583 100644
--- a/README.adoc
+++ b/README.adoc
@@ -55,7 +55,7 @@ To start using this navigator, put the following in your '.zshrc':
----
sdn-navigate () {
# ... possibly zle-line-init
- while eval "`sdn`"; do
+ while eval "`sdn "$BUFFER" "$CURSOR"`"; do
[ -z "$cd" ] || cd "$cd"
[ -z "$insert" ] || LBUFFER="$LBUFFER$insert "
[ -z "$helper" ] && break
@@ -74,7 +74,9 @@ To start using this navigator, put the following in your 'config.fish':
----
function sdn-navigate
set --local IFS
- while eval (sdn | string replace -ar '^(.*?)=' 'set --$1 ')
+ set --local buffer (commandline)
+ set --local cursor (commandline --cursor)
+ while eval (sdn $buffer $cursor | string replace -ar '^(.*?)=' 'set --$1 ')
test -z "$cd" || cd "$cd"
test -z "$insert" || commandline --insert "$insert "
test -z "$helper" && break
@@ -96,7 +98,7 @@ sdn-navigate () {
SDN_L=$READLINE_LINE SDN_P=$READLINE_POINT
READLINE_LINE=
- while eval "`sdn`"; do
+ while eval "`sdn "$SDN_L" "$SDN_P"`"; do
[[ -z "$cd" ]] || cd "$cd"
[[ -z "$insert" ]] || {
SDN_L="${SDN_L:0:$SDN_P}$insert ${SDN_L:$SDN_P}"
@@ -129,6 +131,7 @@ cursor 231 202
bar 16 255 ul
cwd bold
input
+cmdline 102
....
Filename colours are taken from the `LS_COLORS` environment variable.
diff --git a/sdn.cpp b/sdn.cpp
index f3af9bf..38475d4 100644
--- a/sdn.cpp
+++ b/sdn.cpp
@@ -495,6 +495,7 @@ struct level {
};
static struct {
+ wstring cmdline; ///< Outer command line
string cwd; ///< Current working directory
string start_dir; ///< Starting directory
vector<entry> entries; ///< Current directory entries
@@ -525,9 +526,10 @@ static struct {
void (*editor_on_change) (); ///< Callback on editor change
void (*editor_on_confirm) (); ///< Callback on editor confirmation
- enum { AT_CURSOR, AT_BAR, AT_CWD, AT_INPUT, AT_COUNT };
- chtype attrs[AT_COUNT] = {A_REVERSE, 0, A_BOLD, 0};
- const char *attr_names[AT_COUNT] = {"cursor", "bar", "cwd", "input"};
+ enum { AT_CURSOR, AT_BAR, AT_CWD, AT_INPUT, AT_CMDLINE, AT_COUNT };
+ chtype attrs[AT_COUNT] = {A_REVERSE, 0, A_BOLD, 0, 0};
+ const char *attr_names[AT_COUNT] =
+ {"cursor", "bar", "cwd", "input", "cmdline"};
map<int, chtype> ls_colors; ///< LS_COLORS decoded
map<string, chtype> ls_exts; ///< LS_COLORS file extensions
@@ -746,6 +748,9 @@ fun update () {
} else if (!g.message.empty ()) {
move (LINES - 1, 0);
print (apply_attrs (g.message, 0), COLS);
+ } else if (!g.cmdline.empty ()) {
+ move (LINES - 1, 0);
+ print (apply_attrs (g.cmdline, g.attrs[g.AT_CMDLINE]), COLS);
}
refresh ();
@@ -1352,6 +1357,18 @@ fun inotify_check () {
update ();
}
+fun load_cmdline (int argc, char *argv[]) {
+ if (argc < 3)
+ return;
+
+ wstring line = to_wide (argv[1]); int point = atoi (argv[2]);
+ if (line.empty () || point < 0 || point > (int) line.length ())
+ return;
+
+ std::replace_if (line.begin (), line.end (), iswspace, L' ');
+ g.cmdline = line.substr (0, point) + L"◆" + line.substr (point);
+}
+
fun decode_ansi_sgr (const vector<string> &v) -> chtype {
vector<int> args;
for (const auto &arg : v) {
@@ -1627,9 +1644,6 @@ fun save_config () {
}
int main (int argc, char *argv[]) {
- (void) argc;
- (void) argv;
-
// That bitch zle closes stdin before exec without redirection
(void) close (STDIN_FILENO);
if (open ("/dev/tty", O_RDWR)) {
@@ -1658,6 +1672,7 @@ int main (int argc, char *argv[]) {
return 1;
}
+ load_cmdline (argc, argv);
load_colors ();
g.start_dir = g.cwd = initial_cwd ();
reload (false);