Show external command line if appropriate
Since I'm already dealing with the fish shell. All of our supported shells seem to handle cursor position in Unicode (wide character) codepoints. It was easiest and most straight-forward to pass the data through yet-unused program arguments. The cursor position is marked by a Unicode glyph equivalent to ACS_DIAMOND, although ncurses doesn't get a chance to make any ACS translation.
This commit is contained in:
parent
c07f557c16
commit
b8c767354e
|
@ -55,7 +55,7 @@ To start using this navigator, put the following in your '.zshrc':
|
||||||
----
|
----
|
||||||
sdn-navigate () {
|
sdn-navigate () {
|
||||||
# ... possibly zle-line-init
|
# ... possibly zle-line-init
|
||||||
while eval "`sdn`"; do
|
while eval "`sdn "$BUFFER" "$CURSOR"`"; do
|
||||||
[ -z "$cd" ] || cd "$cd"
|
[ -z "$cd" ] || cd "$cd"
|
||||||
[ -z "$insert" ] || LBUFFER="$LBUFFER$insert "
|
[ -z "$insert" ] || LBUFFER="$LBUFFER$insert "
|
||||||
[ -z "$helper" ] && break
|
[ -z "$helper" ] && break
|
||||||
|
@ -74,7 +74,9 @@ To start using this navigator, put the following in your 'config.fish':
|
||||||
----
|
----
|
||||||
function sdn-navigate
|
function sdn-navigate
|
||||||
set --local IFS
|
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 "$cd" || cd "$cd"
|
||||||
test -z "$insert" || commandline --insert "$insert "
|
test -z "$insert" || commandline --insert "$insert "
|
||||||
test -z "$helper" && break
|
test -z "$helper" && break
|
||||||
|
@ -96,7 +98,7 @@ sdn-navigate () {
|
||||||
SDN_L=$READLINE_LINE SDN_P=$READLINE_POINT
|
SDN_L=$READLINE_LINE SDN_P=$READLINE_POINT
|
||||||
READLINE_LINE=
|
READLINE_LINE=
|
||||||
|
|
||||||
while eval "`sdn`"; do
|
while eval "`sdn "$SDN_L" "$SDN_P"`"; do
|
||||||
[[ -z "$cd" ]] || cd "$cd"
|
[[ -z "$cd" ]] || cd "$cd"
|
||||||
[[ -z "$insert" ]] || {
|
[[ -z "$insert" ]] || {
|
||||||
SDN_L="${SDN_L:0:$SDN_P}$insert ${SDN_L:$SDN_P}"
|
SDN_L="${SDN_L:0:$SDN_P}$insert ${SDN_L:$SDN_P}"
|
||||||
|
@ -129,6 +131,7 @@ cursor 231 202
|
||||||
bar 16 255 ul
|
bar 16 255 ul
|
||||||
cwd bold
|
cwd bold
|
||||||
input
|
input
|
||||||
|
cmdline 102
|
||||||
....
|
....
|
||||||
|
|
||||||
Filename colours are taken from the `LS_COLORS` environment variable.
|
Filename colours are taken from the `LS_COLORS` environment variable.
|
||||||
|
|
27
sdn.cpp
27
sdn.cpp
|
@ -495,6 +495,7 @@ struct level {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
|
wstring cmdline; ///< Outer command line
|
||||||
string cwd; ///< Current working directory
|
string cwd; ///< Current working directory
|
||||||
string start_dir; ///< Starting directory
|
string start_dir; ///< Starting directory
|
||||||
vector<entry> entries; ///< Current directory entries
|
vector<entry> entries; ///< Current directory entries
|
||||||
|
@ -525,9 +526,10 @@ static struct {
|
||||||
void (*editor_on_change) (); ///< Callback on editor change
|
void (*editor_on_change) (); ///< Callback on editor change
|
||||||
void (*editor_on_confirm) (); ///< Callback on editor confirmation
|
void (*editor_on_confirm) (); ///< Callback on editor confirmation
|
||||||
|
|
||||||
enum { AT_CURSOR, AT_BAR, AT_CWD, AT_INPUT, AT_COUNT };
|
enum { AT_CURSOR, AT_BAR, AT_CWD, AT_INPUT, AT_CMDLINE, AT_COUNT };
|
||||||
chtype attrs[AT_COUNT] = {A_REVERSE, 0, A_BOLD, 0};
|
chtype attrs[AT_COUNT] = {A_REVERSE, 0, A_BOLD, 0, 0};
|
||||||
const char *attr_names[AT_COUNT] = {"cursor", "bar", "cwd", "input"};
|
const char *attr_names[AT_COUNT] =
|
||||||
|
{"cursor", "bar", "cwd", "input", "cmdline"};
|
||||||
|
|
||||||
map<int, chtype> ls_colors; ///< LS_COLORS decoded
|
map<int, chtype> ls_colors; ///< LS_COLORS decoded
|
||||||
map<string, chtype> ls_exts; ///< LS_COLORS file extensions
|
map<string, chtype> ls_exts; ///< LS_COLORS file extensions
|
||||||
|
@ -746,6 +748,9 @@ fun update () {
|
||||||
} else if (!g.message.empty ()) {
|
} else if (!g.message.empty ()) {
|
||||||
move (LINES - 1, 0);
|
move (LINES - 1, 0);
|
||||||
print (apply_attrs (g.message, 0), COLS);
|
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 ();
|
refresh ();
|
||||||
|
@ -1352,6 +1357,18 @@ fun inotify_check () {
|
||||||
update ();
|
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 {
|
fun decode_ansi_sgr (const vector<string> &v) -> chtype {
|
||||||
vector<int> args;
|
vector<int> args;
|
||||||
for (const auto &arg : v) {
|
for (const auto &arg : v) {
|
||||||
|
@ -1627,9 +1644,6 @@ fun save_config () {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main (int argc, char *argv[]) {
|
int main (int argc, char *argv[]) {
|
||||||
(void) argc;
|
|
||||||
(void) argv;
|
|
||||||
|
|
||||||
// That bitch zle closes stdin before exec without redirection
|
// That bitch zle closes stdin before exec without redirection
|
||||||
(void) close (STDIN_FILENO);
|
(void) close (STDIN_FILENO);
|
||||||
if (open ("/dev/tty", O_RDWR)) {
|
if (open ("/dev/tty", O_RDWR)) {
|
||||||
|
@ -1658,6 +1672,7 @@ int main (int argc, char *argv[]) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
load_cmdline (argc, argv);
|
||||||
load_colors ();
|
load_colors ();
|
||||||
g.start_dir = g.cwd = initial_cwd ();
|
g.start_dir = g.cwd = initial_cwd ();
|
||||||
reload (false);
|
reload (false);
|
||||||
|
|
Loading…
Reference in New Issue