# JingTerm **Repository Path**: outersky/JingTerm ## Basic Information - **Project Name**: JingTerm - **Description**: JingTerm : “静”终端 , 静静的做一个好用的Linux终端 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 45 - **Forks**: 13 - **Created**: 2021-01-02 - **Last Updated**: 2025-08-05 ## Categories & Tags **Categories**: nms **Tags**: None ## README # JingTerm JingTerm : “静”终端,静静的做一个好用的Linux终端,所有功能都可以用键盘控制,代码仅仅1000行! 为了个人日常使用定制的终端,使用Python+Gtk编写,部分逻辑借鉴于deepin的vala版本的 [终端应用](https://github.com/linuxdeepin/deepin-terminal-gtk) 。 ![screenshot1](doc/screenshot1.png) # 欢迎一起研究、完善“JingTerm” 现在代码量不到1000行,主要都在term.py(终端核心代码),term_notebook.py(多Tab支持的代码),我已经尽量写了代码注释,欢迎各路大侠指正! ```shell tony@tonybook:/data/work/gitee/JingTerm$ wc -l *.py 69 context_menu.py 72 keymap.py 86 main.py 31 tab.py 231 term_notebook.py 381 term.py 870 总用量 ``` # 运行 在Deepin 20.1下面测试通过。 1. 首先需要安装依赖: ``` sudo apt install git gir1.2-vte-2.91 ``` 2. 克隆代码: ``` git clone https://gitee.com/outersky/JingTerm.git ``` - 运行 `main.py` - 或者修改 `jingterm.desktop` 中的有关路径, 然后用文件管理器中直接鼠标双击`静终端` (英文系统请点击 `JingTerm` ) 即可,为了方便使用,建议驻留在任务栏 # 使用说明 ## 窗口 - 窗口默认是最大化打开的,可以点击右上角的方框框按钮取消最大化,需要移动位置的话,鼠标按住标题栏的`{ JingTerm } `拖拽即可 - 最大化(全屏)切换: `Alt + F` - 调整透明度 : `Ctrl + Alt + Up/Down` 或者 `Ctrl+鼠标滚轮` - 窗口滚动: `Shift + Page_Up/Page_Down` - 窗口大小调整(非全屏模式): `Alt + Up/Down/Left/Right` 来改变窗口大小 - 如果输出的内容中有链接,可以用 `Ctrl+鼠标点击` 打开链接 ## Tab - 新建Tab: `Ctrl + T` - 关闭Tab: `Ctrl + W` - 切换到下一个Tab:`Ctrl + Page_Down` - 切换到上一个Tab:`Ctrl + Page_Up` - 将本Tab前移一个位置:`Ctrl + Alt + Page_Up` - 将本Tab后移一个位置:`Ctrl + Alt + Page_Down` - 重命名Tab: `F2` 或者鼠标右键->Rename - Tab标题自动缩短: 当标题太长时,会自动进行缩短简化,比如:`tony@tonybook:/data/work/gitee/JingTerm` 将简化成:`~ok:d~w~g~JingTerm` - 右键窗口顶部可以显示所有标签页的菜单,在Tab超多的情况下比较有用。菜单项都带了终端顺序编号,如果移动了Tab的顺序,菜单里面显示的终端序号是不变的,但是在菜单里面的位置会调整。 ![顶部菜单](doc/top_menu.png) ## 终端内的右键菜单 - 主菜单:`Ctrl + Alt + \` 或者 鼠标右键点击 - 模板菜单:`Ctrl + Alt + /` ![模板菜单](doc/template_menu.png) ## 模板菜单自定义 模板文件可以定义在: `~/.config/jingterm/templates.py` 文件中,如: ```python def menu(): global template_menu template_menu = [ ('python','enterln:python','title:Python'), ('work',[ ('/www','enterln:cd /var/www','title:WWW'), ('/prj1','enterln:cd /data/work/python/prj1','title:Prj1'), ]) # 以!开头的名字表示批量模式,后面[]内所有的命令会分不同的tab打开执行 ('!work-all',[ ('/www','enterln:cd /var/www','title:WWW'), ('/prj1','enterln:cd /data/work/python/prj1','title:Prj1'), ]), ] menu() ``` 每项为一个Tuple,第一个元素为右键菜单显示的名称,后面的都是指令,对于一些简单的场景,可以不用写`expect` 了。 ### 模板菜单支持的指令: - enterln: 输入一段文本,并带回车, 如:`enterln:python` - title: 修改Tab的标题,如:`title:Python` - sleep: 暂停n秒,通常用于ssh远程连接较慢的情况,如:`sleep:2.5` ### 模板菜单的子菜单: Tuple的第二个元素如果是数组,那么该定义被认为是子菜单。 ### 模板菜单的批量模式: 如果Tuple的第一个名称以感叹号开头 (`!`) 那么后面的数组里面定义的每一行会在单独的Tab中打开并执行,如上述的配置文件最后一条 `!work-all`,就会同时新建2个Tab。 ## 开发说明: 1. 快捷键请看文件 `term.py` 的 `mapKeyEvent` 函数: ```python def mapKeyEvent(self): return { "Ctrl + Shift + c": lambda: self.copy_clipboard(), # 复制到剪贴板 "Ctrl + Shift + v": lambda: self.paste_clipboard(), # 从剪贴板黏贴 "Ctrl + t": lambda: self.notebook.new_term(), # 开一个新的tab "Ctrl + w": lambda: self.notebook.close_term(self), # 关闭当前tab,如果是最后一个,则退出应用 "Ctrl + Page_Down": lambda: self.notebook.next_term(), # 切换到下一个Tab "Ctrl + Page_Up": lambda: self.notebook.previous_term(), # 切换到前一个Tab "Ctrl + Alt + Page_Down": lambda: self.notebook.move_to_next(), # 将Tab右移一个位置 "Ctrl + Alt + Page_Up": lambda: self.notebook.move_to_previous(), # 将Tab左移一个位置 "Ctrl + Alt + \\": lambda: self.popup_menu(), # 弹出右键菜单(包含有模板子菜单) "Ctrl + Alt + /": lambda: self.popup_template_menu(), # 仅仅弹出模板菜单 "Ctrl + Alt + Up": lambda: self.notebook.increase_opacity(), # 增加透明度 "Ctrl + Alt + Down": lambda: self.notebook.decrease_opacity(), # 降低透明度 "Alt + f": lambda: self.notebook.window.do_max(None), # 最大化 "Alt + Left": lambda: self.resize_window(-20, 0), # 变窄 "Alt + Right": lambda: self.resize_window(20, 0), # 变宽 "Alt + Up": lambda: self.resize_window(0, -20), # 变矮 "Alt + Down": lambda: self.resize_window(0, 20), # 变高 "F2": lambda: self.notebook.rename_term() # 修改title } ``` 2. 如果要修改模板菜单配置文件的位置,请看`context_menu.py`的`load_menu`函数: ```python def load_menu(self): # 如果有本地配置文件, 就优先加载 cfg_file = '{}/.config/jingterm/templates.py'.format(os.getenv('HOME')) ... ``` 3. 字体颜色等,可以在`app.css`文件中配置, 但是终端的字体现在要在`term.py`的`__init__`中定义: ```python #设置字体,貌似GTK的css不起作用,只能在代码里面设置 font_desc = Pango.FontDescription("Noto Sans Mono 12") self.set_font(font_desc) ``` # TODO - 怎么能够实现双击标签栏的空白处新建Tab,拖拽空白可以移动窗口? - 模板指令现在只有简单的sleep功能,需要增加内容的检测,类似于`expect`指令 - 增加多种主题的支持,包括窗口的主题和终端里面的颜色主题 # 发布历史 ## V1.0(2021-01-03) - 基本功能已经完善,满足日常工作基本需要