init:初版代码。
This commit is contained in:
commit
332e0c53b7
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Xmake cache
|
||||
.xmake/
|
||||
build/
|
||||
|
||||
# MacOS Cache
|
||||
.DS_Store
|
||||
compile_commands.json
|
||||
|
18
.vscode/settings.json
vendored
Normal file
18
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"files.autoSave": "onFocusChange",
|
||||
"editor.fontSize": 14,
|
||||
"editor.fontFamily": "'Source Code Pro', 'Courier New', monospace",
|
||||
"terminal.integrated.fontFamily": "Source Code Pro",
|
||||
"editor.fontLigatures": true,
|
||||
"C_Cpp.default.configurationProvider": "tboox.xmake-vscode",
|
||||
"cmake.configureOnOpen": false,
|
||||
"C_Cpp.default.compileCommands": "${workspaceRoot}/build/compile_commands.json",
|
||||
"C_Cpp.default.cppStandard": "c++17",
|
||||
"editor.inlayHints.enabled": "off",
|
||||
"editor.unicodeHighlight.allowedLocales": {
|
||||
"ja": true,
|
||||
"zh-hant": true,
|
||||
"zh-hans": true
|
||||
},
|
||||
"makefile.configureOnOpen": false
|
||||
}
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# 简介
|
||||
|
||||
在控制台程序中,可以补全文件路径。
|
||||
|
||||
本项目修改自 [https://github.com/DieTime/cli-autocomplete](https://github.com/DieTime/cli-autocomplete) 。
|
238
src/filecomplete.cpp
Normal file
238
src/filecomplete.cpp
Normal file
@ -0,0 +1,238 @@
|
||||
#include "filecomplete.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define MAX_OF(x, y) (((x) > (y)) ? (x) : (y))
|
||||
|
||||
#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN64)
|
||||
#ifndef OS_WINDOWS
|
||||
#define OS_WINDOWS
|
||||
|
||||
#include <windows.h>
|
||||
#include <conio.h>
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#elif defined(__APPLE__) || defined(__unix__) || defined(__unix) || defined(unix) || defined(__linux__)
|
||||
#ifndef OS_UNIX
|
||||
#define OS_UNIX
|
||||
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#else
|
||||
#error Unknown environment!
|
||||
#endif
|
||||
|
||||
#if defined(OS_WINDOWS)
|
||||
#define ENTER 13
|
||||
#define BACKSPACE 8
|
||||
#define LEFT 75
|
||||
#define RIGHT 77
|
||||
#define UP 72
|
||||
#define DOWN 80
|
||||
#define DEL 83
|
||||
#define CTRL_C 3
|
||||
#define SPECIAL_SEQ_1 0
|
||||
#define SPECIAL_SEQ_2 224
|
||||
#define COLOR_TYPE uint16_t
|
||||
#define DEFAULT_TITLE_COLOR 160
|
||||
#define DEFAULT_PREDICT_COLOR 8
|
||||
#define DEFAULT_MAIN_COLOR 7
|
||||
#elif defined(OS_UNIX)
|
||||
#define ENTER 10
|
||||
#define BACKSPACE 127
|
||||
#define LEFT 68
|
||||
#define RIGHT 67
|
||||
#define UP 65
|
||||
#define DOWN 66
|
||||
#define DEL 51
|
||||
#define DEL_AFTER 126
|
||||
#define SPECIAL_SEQ_1 27
|
||||
#define SPECIAL_SEQ_2 91
|
||||
#define COLOR_TYPE char *
|
||||
#define DEFAULT_TITLE_COLOR "0;30;102"
|
||||
#define DEFAULT_PREDICT_COLOR "90"
|
||||
#define DEFAULT_MAIN_COLOR "0"
|
||||
#endif
|
||||
#define SPACE 32
|
||||
#define TAB 9
|
||||
|
||||
short terminal_width()
|
||||
{
|
||||
#if defined(OS_WINDOWS)
|
||||
// Handle current terminal
|
||||
HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (h_console == NULL)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't handle terminal\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Get current attributes
|
||||
CONSOLE_SCREEN_BUFFER_INFO console_info;
|
||||
if (GetConsoleScreenBufferInfo(h_console, &console_info) == 0)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't get terminal info\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Return current width
|
||||
return console_info.dwSize.X;
|
||||
#elif defined(OS_UNIX)
|
||||
struct winsize t_size;
|
||||
|
||||
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &t_size) == -1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't get terminal info\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return (short)t_size.ws_col;
|
||||
#endif
|
||||
}
|
||||
|
||||
void clear_line()
|
||||
{
|
||||
#if defined(OS_WINDOWS)
|
||||
// Get current terminal width
|
||||
short width = terminal_width();
|
||||
if (width < 1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Size of terminal is too small\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Create long empty string
|
||||
char *empty = (char *)malloc(sizeof(char) * width);
|
||||
memset(empty, ' ', width);
|
||||
empty[width - 1] = '\0';
|
||||
|
||||
// Clear line
|
||||
printf("\r%s\r", empty);
|
||||
|
||||
// Free line
|
||||
free(empty);
|
||||
#elif defined(OS_UNIX)
|
||||
printf("\033[2K\r");
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_cursor_x(short x)
|
||||
{
|
||||
#if defined(OS_WINDOWS)
|
||||
HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (h_console == NULL)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't handle terminal\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Create position
|
||||
COORD xy;
|
||||
xy.X = x - 1;
|
||||
xy.Y = get_cursor_y();
|
||||
|
||||
// Set cursor position
|
||||
if (SetConsoleCursorPosition(h_console, xy) == 0)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't set terminal cursor position\n");
|
||||
exit(1);
|
||||
}
|
||||
#elif defined(OS_UNIX)
|
||||
printf("\033[%d;%dH", get_cursor_y(), x);
|
||||
#endif
|
||||
}
|
||||
|
||||
short get_cursor_y()
|
||||
{
|
||||
#if defined(OS_WINDOWS)
|
||||
HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (h_console == NULL)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't handle terminal\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Get terminal info
|
||||
CONSOLE_SCREEN_BUFFER_INFO console_info;
|
||||
if (GetConsoleScreenBufferInfo(h_console, &console_info) == 0)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't get terminal Y position\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Return Y position
|
||||
return console_info.dwCursorPosition.Y;
|
||||
#elif defined(OS_UNIX)
|
||||
struct termios old_attr, new_attr;
|
||||
char ch, buf[30] = {0};
|
||||
int i = 0, pow = 1, y = 0;
|
||||
|
||||
// Backup terminal attributes
|
||||
if (tcgetattr(STDIN_FILENO, &new_attr) == -1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't get terminal attributes\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Disable echo
|
||||
old_attr = new_attr;
|
||||
old_attr.c_lflag &= ~(ICANON | ECHO);
|
||||
if (tcsetattr(STDIN_FILENO, TCSANOW, &old_attr) == -1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't set terminal attributes\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Get info about cursor
|
||||
if (write(STDOUT_FILENO, "\033[6n", 4) != 4)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't get cursor information\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Get ^[[{this};1R value
|
||||
|
||||
for (ch = 0; ch != 'R'; i++)
|
||||
{
|
||||
if (read(STDIN_FILENO, &ch, 1) != 1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't read cursor information");
|
||||
exit(1);
|
||||
}
|
||||
buf[i] = ch;
|
||||
}
|
||||
|
||||
i -= 2;
|
||||
while (buf[i] != ';')
|
||||
{
|
||||
i -= 1;
|
||||
}
|
||||
|
||||
i -= 1;
|
||||
while (buf[i] != '[')
|
||||
{
|
||||
y = y + (buf[i] - '0') * pow;
|
||||
pow *= 10;
|
||||
i -= 1;
|
||||
}
|
||||
|
||||
// Reset attributes
|
||||
if (tcsetattr(0, TCSANOW, &new_attr) == -1)
|
||||
{
|
||||
fprintf(stderr, "[ERROR] Couldn't reset terminal attributes\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return (short)y;
|
||||
#endif
|
||||
}
|
6
src/filecomplete.h
Normal file
6
src/filecomplete.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
short terminal_width();
|
||||
void clear_line();
|
||||
void set_cursor_x(short x);
|
||||
short get_cursor_y();
|
6
src/main.cpp
Normal file
6
src/main.cpp
Normal file
@ -0,0 +1,6 @@
|
||||
#include "filecomplete.h"
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user