Cancel multiline input on Ctrl-C.
This commit is contained in:
		
							parent
							
								
									2d729e4f6f
								
							
						
					
					
						commit
						64080d26fe
					
				
					 1 changed files with 9 additions and 11 deletions
				
			
		
							
								
								
									
										20
									
								
								nix-repl.cc
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								nix-repl.cc
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -41,7 +41,7 @@ struct NixRepl
 | 
			
		|||
    NixRepl(const Strings & searchPath);
 | 
			
		||||
    void mainLoop(const Strings & files);
 | 
			
		||||
    void completePrefix(string prefix);
 | 
			
		||||
    bool getLine(string & line, const char * prompt);
 | 
			
		||||
    bool getLine(string & input, const char * prompt);
 | 
			
		||||
    bool processLine(string line);
 | 
			
		||||
    void loadFile(const Path & path);
 | 
			
		||||
    void initEnv();
 | 
			
		||||
| 
						 | 
				
			
			@ -102,15 +102,11 @@ void NixRepl::mainLoop(const Strings & files)
 | 
			
		|||
        // When continuing input from a previous, don't print a prompt, just align to the same
 | 
			
		||||
        // number of chars as the prompt.
 | 
			
		||||
        const char * prompt = input.empty() ? "nix-repl> " : "          ";
 | 
			
		||||
        string line;
 | 
			
		||||
        if (!getLine(line, prompt)) {
 | 
			
		||||
        if (!getLine(input, prompt)) {
 | 
			
		||||
            std::cout << std::endl;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        input.append(removeWhitespace(line));
 | 
			
		||||
        input.push_back('\n');
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            if (!processLine(input)) return;
 | 
			
		||||
        } catch (ParseError & e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +163,7 @@ char * completerThunk(const char * s, int state)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool NixRepl::getLine(string & line, const char * prompt)
 | 
			
		||||
bool NixRepl::getLine(string & input, const char * prompt)
 | 
			
		||||
{
 | 
			
		||||
    struct sigaction act, old;
 | 
			
		||||
    act.sa_handler = sigintHandler;
 | 
			
		||||
| 
						 | 
				
			
			@ -176,15 +172,17 @@ bool NixRepl::getLine(string & line, const char * prompt)
 | 
			
		|||
    if (sigaction(SIGINT, &act, &old))
 | 
			
		||||
        throw SysError("installing handler for SIGINT");
 | 
			
		||||
 | 
			
		||||
    if (sigsetjmp(sigintJmpBuf, 1))
 | 
			
		||||
        line = "";
 | 
			
		||||
    else {
 | 
			
		||||
    if (sigsetjmp(sigintJmpBuf, 1)) {
 | 
			
		||||
        input.clear();
 | 
			
		||||
    } else {
 | 
			
		||||
        curRepl = this;
 | 
			
		||||
        rl_completion_entry_function = completerThunk;
 | 
			
		||||
 | 
			
		||||
        char * s = readline(prompt);
 | 
			
		||||
        if (!s) return false;
 | 
			
		||||
        line = chomp(string(s));
 | 
			
		||||
        string line = chomp(string(s));
 | 
			
		||||
        input.append(removeWhitespace(line));
 | 
			
		||||
        input.push_back('\n');
 | 
			
		||||
        free(s);
 | 
			
		||||
        if (line != "") {
 | 
			
		||||
            add_history(line.c_str());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue