~exec64/imv

4690692154ec9004fa2b7705628616e98d94006e — Ivan Oleynikov 11 months ago 9ae3ee1
Set IFS env variable to "" for overlay_text shell expansion

This prevents wordexp function from splitting the output of shell expansion
into “words” and, as a consequence, removing the newlines from it. With this
commit applied, setting

  overlay_text = $(echo -e 'hello\nworld!')

displays

  hello
  world!

in Imv window. Without this commit, the same overlay_text setting would display

  hello world!

since wordexp splits the string "hello\nworld!" into two words and connects
them with a space.

This should not break any of the commands executed in $(), because the IFS
variable is *not* inherited by their shell. The commands don't see this change
and run with the default IFS value.
1 files changed, 2 insertions(+), 0 deletions(-)

M src/imv.c
M src/imv.c => src/imv.c +2 -0
@@ 1979,6 1979,7 @@ static size_t generate_env_text(struct imv *imv, char *buf, size_t buf_len, cons

  size_t len = 0;
  wordexp_t word;
  setenv("IFS", "", 1);
  if (wordexp(format, &word, 0) == 0) {
    for (size_t i = 0; i < word.we_wordc; ++i) {
      len += snprintf(buf + len, buf_len - len, "%s ", word.we_wordv[i]);


@@ 1987,6 1988,7 @@ static size_t generate_env_text(struct imv *imv, char *buf, size_t buf_len, cons
  } else {
    len += snprintf(buf, buf_len, "error expanding text");
  }
  unsetenv("IFS");

  return len;
}