Search code examples
bashvim

Bash: Kill Vim when "Vim: Warning: Output not to a terminal"


Every once in awhile I make a mistake at the command line, and use vim in a subshell.

This of course locks up that terminal window, and outputs a bunch of errors, with the main error being

Vim: Warning: Output not to a terminal

Is there a way for me to configure vim so it automatically dies when this happens, and doesn't hang my terminal?

I know I could probably figure out the process id of this vim instance, and kill it, but I would like a better solution if possible, as I tend to run lots of different vim instances in different tmux panes/windows. Thanks!


Solution

  • You can prevent it from starting in the first place easily enough. Consider putting the following function definition in your .bashrc:

    vim() {
      [ -t 1 ] || { echo "Not starting vim without stdout to TTY!" >&2; return 1; }
      command vim "$@"
    }
    

    The command builtin prevents recursing, by ensuring that it invokes an external command (rather than just calling the function again).

    Similarly, you could create a script $HOME/bin/vim:

    #!/bin/sh
    if [ -t 1 ]; then
      exec /usr/bin/vim "$@"
    else
      echo "Not starting vim without stdout to TTY!" >&2
      exit 1
    fi
    

    ...put $HOME/bin first in your PATH, and let that shim do the work without relying on a shell function.