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:
Přemysl Eric Janouch 2020-10-01 11:54:01 +02:00
parent c07f557c16
commit b8c767354e
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 27 additions and 9 deletions

View File

@ -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
View File

@ -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);