mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			211 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id: mode-key.c,v 1.12 2009-05-14 19:36:56 nicm Exp $ */
 | 
						|
 | 
						|
/*
 | 
						|
 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, and distribute this software for any
 | 
						|
 * purpose with or without fee is hereby granted, provided that the above
 | 
						|
 * copyright notice and this permission notice appear in all copies.
 | 
						|
 *
 | 
						|
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
						|
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
						|
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
						|
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
						|
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 | 
						|
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 | 
						|
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 */
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
 | 
						|
#include "tmux.h"
 | 
						|
 | 
						|
enum mode_key_cmd mode_key_lookup_vi(struct mode_key_data *, int);
 | 
						|
enum mode_key_cmd mode_key_lookup_emacs(struct mode_key_data *, int);
 | 
						|
 | 
						|
void
 | 
						|
mode_key_init(struct mode_key_data *mdata, int type, int flags)
 | 
						|
{
 | 
						|
	mdata->type = type;
 | 
						|
 | 
						|
	if (flags & MODEKEY_CANEDIT)
 | 
						|
		flags |= MODEKEY_EDITMODE;
 | 
						|
	mdata->flags = flags;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
mode_key_free(unused struct mode_key_data *mdata)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
enum mode_key_cmd
 | 
						|
mode_key_lookup(struct mode_key_data *mdata, int key)
 | 
						|
{
 | 
						|
	switch (mdata->type) {
 | 
						|
	case MODEKEY_VI:
 | 
						|
		return (mode_key_lookup_vi(mdata, key));
 | 
						|
	case MODEKEY_EMACS:
 | 
						|
		return (mode_key_lookup_emacs(mdata, key));
 | 
						|
	default:
 | 
						|
		fatalx("unknown mode key type");
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
enum mode_key_cmd
 | 
						|
mode_key_lookup_vi(struct mode_key_data *mdata, int key)
 | 
						|
{
 | 
						|
	if (KEYC_ISESC(key)) {
 | 
						|
		key = KEYC_REMOVEESC(key);
 | 
						|
		if (mdata->flags & MODEKEY_CANEDIT)
 | 
						|
			mdata->flags ^= MODEKEY_EDITMODE;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	if (mdata->flags & MODEKEY_EDITMODE) {
 | 
						|
		switch (key) {
 | 
						|
		case '\003':
 | 
						|
			return (MODEKEYCMD_QUIT);
 | 
						|
		case '\033':
 | 
						|
			if (mdata->flags & MODEKEY_CANEDIT)
 | 
						|
				mdata->flags &= ~MODEKEY_EDITMODE;
 | 
						|
			return (MODEKEYCMD_NONE);
 | 
						|
		case '\010':
 | 
						|
		case '\177':
 | 
						|
			return (MODEKEYCMD_BACKSPACE);
 | 
						|
		case '\011':
 | 
						|
			return (MODEKEYCMD_COMPLETE);
 | 
						|
		case KEYC_DC:
 | 
						|
			return (MODEKEYCMD_DELETE);
 | 
						|
		case '\r':
 | 
						|
			return (MODEKEYCMD_CHOOSE);
 | 
						|
		}
 | 
						|
		return (MODEKEYCMD_OTHERKEY);
 | 
						|
	}
 | 
						|
 | 
						|
	switch (key) {
 | 
						|
	case '\010':
 | 
						|
	case '\177':
 | 
						|
		return (MODEKEYCMD_LEFT);
 | 
						|
	case KEYC_DC:
 | 
						|
		return (MODEKEYCMD_DELETE);
 | 
						|
	case '\011':
 | 
						|
		return (MODEKEYCMD_COMPLETE);
 | 
						|
	case 'i':
 | 
						|
		if (mdata->flags & MODEKEY_CANEDIT)
 | 
						|
			mdata->flags |= MODEKEY_EDITMODE;
 | 
						|
		break;
 | 
						|
	case 'a':
 | 
						|
		if (mdata->flags & MODEKEY_CANEDIT) {
 | 
						|
			mdata->flags |= MODEKEY_EDITMODE;
 | 
						|
			return (MODEKEYCMD_RIGHT);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case '\r':
 | 
						|
		if (mdata->flags & (MODEKEY_CANEDIT|MODEKEY_CHOOSEMODE))
 | 
						|
			return (MODEKEYCMD_CHOOSE);
 | 
						|
		return (MODEKEYCMD_COPYSELECTION);
 | 
						|
	case '0':
 | 
						|
	case '^':
 | 
						|
		return (MODEKEYCMD_STARTOFLINE);
 | 
						|
	case '\033':
 | 
						|
		return (MODEKEYCMD_CLEARSELECTION);
 | 
						|
	case 'j':
 | 
						|
	case KEYC_DOWN:
 | 
						|
		return (MODEKEYCMD_DOWN);
 | 
						|
	case '$':
 | 
						|
		return (MODEKEYCMD_ENDOFLINE);
 | 
						|
	case 'h':
 | 
						|
	case KEYC_LEFT:
 | 
						|
		return (MODEKEYCMD_LEFT);
 | 
						|
	case '\006':
 | 
						|
	case KEYC_NPAGE:
 | 
						|
		return (MODEKEYCMD_NEXTPAGE);
 | 
						|
	case 'w':
 | 
						|
		return (MODEKEYCMD_NEXTWORD);
 | 
						|
	case '\025':
 | 
						|
	case KEYC_PPAGE:
 | 
						|
		return (MODEKEYCMD_PREVIOUSPAGE);
 | 
						|
	case 'b':
 | 
						|
		return (MODEKEYCMD_PREVIOUSWORD);
 | 
						|
	case 'q':
 | 
						|
	case '\003':
 | 
						|
		return (MODEKEYCMD_QUIT);
 | 
						|
	case 'l':
 | 
						|
	case KEYC_RIGHT:
 | 
						|
		return (MODEKEYCMD_RIGHT);
 | 
						|
	case ' ':
 | 
						|
		return (MODEKEYCMD_STARTSELECTION);
 | 
						|
	case 'k':
 | 
						|
	case KEYC_UP:
 | 
						|
		return (MODEKEYCMD_UP);
 | 
						|
	case 'p':
 | 
						|
		return (MODEKEYCMD_PASTE);
 | 
						|
	}
 | 
						|
 | 
						|
	return (MODEKEYCMD_NONE);
 | 
						|
}
 | 
						|
 | 
						|
enum mode_key_cmd
 | 
						|
mode_key_lookup_emacs(struct mode_key_data *mdata, int key)
 | 
						|
{
 | 
						|
	switch (key) {
 | 
						|
	case '\010':
 | 
						|
	case '\177':
 | 
						|
		return (MODEKEYCMD_BACKSPACE);
 | 
						|
	case KEYC_DC:
 | 
						|
		return (MODEKEYCMD_DELETE);
 | 
						|
	case '\011':
 | 
						|
		return (MODEKEYCMD_COMPLETE);
 | 
						|
	case '\r':
 | 
						|
		return (MODEKEYCMD_CHOOSE);
 | 
						|
	case '\001':
 | 
						|
		return (MODEKEYCMD_STARTOFLINE);
 | 
						|
	case '\007':
 | 
						|
		return (MODEKEYCMD_CLEARSELECTION);
 | 
						|
	case '\027':
 | 
						|
	case KEYC_ADDESC('w'):
 | 
						|
		return (MODEKEYCMD_COPYSELECTION);
 | 
						|
	case '\016':
 | 
						|
	case KEYC_DOWN:
 | 
						|
		return (MODEKEYCMD_DOWN);
 | 
						|
	case '\005':
 | 
						|
		return (MODEKEYCMD_ENDOFLINE);
 | 
						|
	case '\002':
 | 
						|
	case KEYC_LEFT:
 | 
						|
		return (MODEKEYCMD_LEFT);
 | 
						|
	case ' ':
 | 
						|
		if (mdata->flags & MODEKEY_CANEDIT)
 | 
						|
			break;
 | 
						|
		/* FALLTHROUGH */
 | 
						|
	case '\026':
 | 
						|
	case KEYC_NPAGE:
 | 
						|
		return (MODEKEYCMD_NEXTPAGE);
 | 
						|
	case KEYC_ADDESC('f'):
 | 
						|
		return (MODEKEYCMD_NEXTWORD);
 | 
						|
	case '\031':
 | 
						|
		return (MODEKEYCMD_PASTE);
 | 
						|
	case KEYC_ADDESC('v'):
 | 
						|
	case KEYC_PPAGE:
 | 
						|
		return (MODEKEYCMD_PREVIOUSPAGE);
 | 
						|
	case KEYC_ADDESC('b'):
 | 
						|
		return (MODEKEYCMD_PREVIOUSWORD);
 | 
						|
	case '\006':
 | 
						|
	case KEYC_RIGHT:
 | 
						|
		return (MODEKEYCMD_RIGHT);
 | 
						|
	case '\000':
 | 
						|
		return (MODEKEYCMD_STARTSELECTION);
 | 
						|
	case '\020':
 | 
						|
	case KEYC_UP:
 | 
						|
		return (MODEKEYCMD_UP);
 | 
						|
	case 'q':
 | 
						|
		if (mdata->flags & MODEKEY_CANEDIT)
 | 
						|
			break;
 | 
						|
		/* FALLTHROUGH */
 | 
						|
	case '\003':
 | 
						|
	case '\033':
 | 
						|
		return (MODEKEYCMD_QUIT);
 | 
						|
	}
 | 
						|
 | 
						|
	return (MODEKEYCMD_OTHERKEY);
 | 
						|
}
 |