首页
游戏
影视
直播
广播
听书
音乐
图片
更多
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
Search
1
在IC617中进行xa+vcs数模混仿
81 阅读
2
科普:Memory Compiler生成的Register file和SRAM有何区别?
73 阅读
3
virtuoso和empyrean alps模拟仿真和混仿教程
73 阅读
4
后仿中$setup,$hold与$setuphold
44 阅读
5
文档内容搜索哪家强? 15款文件搜索软件横向评测
35 阅读
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
登录
Search
标签搜索
python
Docker
vscode
linux
systemverilog
vcs
STM32
PyQT
EDA
FPGA
gvim
cadence
Alist
xilinx
UVM
uos
macos
package
MCU
risc-v
bennyhe
累计撰写
378
篇文章
累计收到
31
条评论
首页
栏目
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
页面
游戏
影视
直播
广播
听书
音乐
图片
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
搜索到
42
篇与
的结果
2025-10-26
Linux自动化脚本工具——AutoKey简介
下面简介了AutoKey软件的概述、安装和使用方法。了解到这个软件的起因是在Ubuntu中想实现Windows中的自定义短语,但是Ubuntu中的Ibus输入法不是很支持该功能。搜索之后了解到espanso和AutoKey可以实现该功能。另外,AutoKey和WIndows中的AutoHotKey功能很相似,但并不是同一个软件。注:AutoKey目前不支持Wayland协议,只支持Xorg,而Ubuntu22.04默认使用的是Wayland。虽然可以切换,但也很麻烦。生成AI:Claude-3-Opus(POE)官方文档:1. https://github.com/autokey/autokey 2. Welcome to AutoKey!1 AutoKey 简介什么是 AutoKeyAutoKey 是一款开源的 Linux 桌面自动化工具,主要用于自动输入文本和执行预定义的操作。它可以帮助用户将常用的短语、句子或代码片段绑定到缩写或热键上,从而提高输入效率,节省时间。AutoKey 支持纯文本和富文本格式,可以在各种应用程序中使用,如文本编辑器、邮件客户端、IDE 等。AutoKey 的主要功能AutoKey 提供了以下主要功能:文本替换:将预定义的缩写替换为相应的文本内容,支持纯文本和富文本格式。脚本执行:可以将 Python 脚本绑定到缩写或热键上,实现更加灵活和强大的自动化操作。快捷键绑定:可以将缩写或脚本绑定到特定的热键组合,通过按键触发相应的操作。应用程序特定的缩写:可以为特定的应用程序设置专属的缩写,实现更加精准的自动化。文本模板:支持创建包含动态内容的文本模板,如日期、时间、剪贴板内容等。AutoKey 的工作原理AutoKey 的工作原理如下:用户在 AutoKey 中创建缩写,并将其绑定到相应的文本内容或 Python 脚本。AutoKey 在后台监听用户的键盘输入,当检测到与预定义缩写匹配的输入时,触发相应的替换操作。如果缩写绑定的是文本内容,AutoKey 会自动删除缩写,并将绑定的文本内容输入到当前光标所在位置。如果缩写绑定的是 Python 脚本,AutoKey 会执行该脚本,并根据脚本的逻辑执行相应的自动化操作,如模拟按键、粘贴文本、控制窗口等。AutoKey 的优势和适用场景AutoKey 的优势包括:提高输入效率:通过将常用的文本绑定到缩写,可以显著减少输入所需的时间和按键次数。自动化重复性任务:利用 Python 脚本,可以自动执行一些重复性的操作,如数据格式转换、文件处理等。减少错误:预定义的缩写和脚本可以确保输入的一致性和准确性,减少手动输入带来的错误。易于自定义:用户可以根据自己的需求,创建和管理缩写和脚本,实现个性化的自动化。AutoKey 适用于以下场景:编程:可以将常用的代码片段、函数模板绑定到缩写,提高编码效率。文案写作:可以将常用的句子、段落、签名等绑定到缩写,加快写作速度。客户服务:可以将常用的回复模板绑定到缩写,提高响应速度和一致性。数据录入:可以将常用的数据格式、表格模板绑定到缩写,简化录入过程。总之,AutoKey 是一款功能强大、灵活易用的 Linux 自动化工具,通过自定义缩写和脚本,可以显著提高工作效率,适用于各种需要重复输入和操作的场景。2 AutoKey 的安装和配置在 Ubuntu 系统中安装 AutoKey在 Ubuntu 系统中,可以通过两种方式安装 AutoKey:通过 Ubuntu 软件中心安装或使用 apt 命令安装。通过 Ubuntu 软件中心安装打开 Ubuntu 软件中心。在搜索框中输入 "AutoKey",点击搜索。在搜索结果中找到 "AutoKey" 应用,点击 "安装" 按钮。输入用户密码,等待安装完成。使用 apt 命令安装打开终端。输入以下命令,按回车执行:sudo apt updatesudo apt install autokey-gtk输入用户密码,等待安装完成。启动和配置 AutoKey启动 AutoKey安装完成后,可以通过以下方式启动 AutoKey:在 Ubuntu 的应用程序菜单中找到并点击 "AutoKey" 图标。在终端中输入 autokey-gtk 命令,按回车执行。熟悉 AutoKey 的用户界面AutoKey 的主界面由以下几个部分组成:缩写列表:显示所有已创建的缩写。缩写编辑器:用于编辑选中的缩写的内容和属性。工具栏:包含常用的操作按钮,如新建缩写、保存、删除等。菜单栏:提供访问 AutoKey 各种功能和设置的菜单项。创建和管理缩写创建新的缩写在 AutoKey 主界面中,点击工具栏上的 "新建" 按钮,或右键点击缩写列表中的 "My Phrases" 文件夹,选择 "New" > "Phrase"。在缩写编辑器中,输入缩写的名称、缩写内容以及可选的注释。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存缩写。编辑和删除现有缩写在缩写列表中,双击要编辑的缩写,或选中缩写后点击工具栏上的 "编辑" 按钮。在缩写编辑器中,修改缩写的内容或属性。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存修改。要删除缩写,在缩写列表中选中要删除的缩写,点击工具栏上的 "删除" 按钮,或按 Delete 键。设置触发方式AutoKey 支持两种触发方式:缩写触发和快捷键触发。缩写触发在缩写编辑器中,找到 "Abbreviations" 字段。输入要用作触发缩写的缩写内容,多个缩写之间用逗号分隔。保存缩写。当在任意应用程序中输入设定的缩写并按下空格、回车或标点符号时,缩写将被替换为预定义的内容。快捷键触发在缩写编辑器中,找到 "Hotkey" 字段。点击 "Set" 按钮,按下要用作触发缩写的快捷键组合。保存缩写。当在任意应用程序中按下设定的快捷键时,缩写内容将被插入到光标所在位置。通过以上步骤,你可以在 Ubuntu 系统中安装、配置 AutoKey,并创建和管理自定义的缩写。合理使用缩写触发和快捷键触发,可以显著提高输入效率和工作流程的自动化程度。3 AutoKey 的进阶使用使用 Python 脚本扩展 AutoKey 功能AutoKey 支持使用 Python 脚本来扩展其功能,使其能够执行更加复杂和灵活的自动化任务。编写 Python 脚本在 AutoKey 主界面中,右键点击 "My Scripts" 文件夹,选择 "New" > "Script"。在脚本编辑器中,输入 Python 脚本的内容。AutoKey 提供了一些内置的模块和函数,如 keyboard、mouse、system 等,可以用于模拟键盘输入、鼠标操作和执行系统命令等。保存脚本,并为其指定一个易于识别的名称。在缩写中调用 Python 脚本创建一个新的缩写或编辑现有的缩写。在缩写内容中,使用 标签来引用 Python 脚本,例如 myscript.py。保存缩写。当触发该缩写时,AutoKey 将执行指定的 Python 脚本。AutoKey 的常见问题和解决方法常见问题 1:缩写无法触发可能原因: - 缩写内容与实际输入不匹配。 - 缩写触发方式设置不正确。 - AutoKey 服务未启动或已停止。解决方法: 1. 仔细检查缩写内容,确保与实际输入完全匹配。 2. 检查缩写的触发方式设置,确保已选择正确的触发方式(缩写触发或快捷键触发)。 3. 确保 AutoKey 服务已启动并正常运行。如果服务已停止,可以在终端中输入 autokey-gtk 命令重新启动。常见问题 2:Python 脚本执行错误可能原因: - Python 脚本中存在语法错误或逻辑错误。 - 脚本中使用的模块或函数不受支持或未正确导入。解决方法: 1. 仔细检查 Python 脚本的语法和逻辑,确保没有错误。 2. 确保脚本中使用的模块和函数已正确导入,并受 AutoKey 支持。可以参考 AutoKey 的文档和示例代码。AutoKey 的使用技巧和建议使用技巧 1:创建递归缩写递归缩写是指在缩写的替换内容中包含缩写本身,从而实现多级展开。例如,创建缩写 "dt" 替换为 "$(date +%Y-%m-%d) $(date +%H:%M:%S)"。当输入 "dtdt" 时,将展开为 "2023-04-20 10:30:00 2023-04-20 10:30:00"。使用技巧 2:使用 Python 脚本实现动态内容在 Python 脚本中,可以使用变量、函数和控制结构等编程元素来生成动态内容。例如,可以编写脚本从文件或数据库中读取数据,根据条件生成不同的输出,或执行一些自动化操作后返回结果。AutoKey 的替代品和对比替代品 1:EspansoEspanso 是一款跨平台的文本扩展工具,支持 Windows、macOS 和 Linux。它使用 YAML 格式的配置文件来定义缩写和替换内容,支持 Shell 和 JavaScript 脚本,并提供了丰富的匹配选项和变量。与 AutoKey 相比,Espanso 的优势在于跨平台支持和更简洁的配置语法,但缺少图形化的用户界面。替代品 2:AutoHotkey (Windows)AutoHotkey 是一款功能强大的 Windows 自动化脚本语言和工具,可用于创建热键、宏、文本扩展等。它使用自己的脚本语言,提供了大量的内置函数和命令,可以与 Windows API 和其他应用程序交互。与 AutoKey 相比,AutoHotkey 更加灵活和功能丰富,但仅支持 Windows 平台,学习曲线也较为陡峭。总的来说,AutoKey 的进阶使用涉及 Python 脚本的编写和调用,以及一些常见问题的解决方法和使用技巧。对于有更高级需求的用户,可以考虑使用 Espanso 或 AutoHotkey 等替代工具,根据具体的使用场景和平台选择最适合的方案。
2025年10月26日
7 阅读
0 评论
0 点赞
2025-10-10
gvim+tmux 和vscode+neovim 的ide 模式
vscode 界面安装的插件:vscode+neovim 设置参考这篇文档:http://bennyhe.cn/index.php/archives/327/gvim 的界面:常用功能都有,文件浏览、语法高亮、彩虹括号、括号自动补齐、输入关键词提示,ctag 函数跳转、文档状态、多terminal(tmux)集成等等常用功能。terminal界面采用tmux,配合clipper 工具可以和gvim 文本窗口互相粘贴,可以分页多个terminal。gvim 按照的插件~/.vim/ 下文件夹结构~/.vim/ 下文件(插件)acp.vim auto-pairs.vim grep.vim mark.vim NERD_tree.vim scala.vim Tabular.vim verilog_systemverilog.vim vtreeexplorer.vimairline.vim ctrlp.vim marksbrowser.vim matchit.vim rainbow_parentheses.vim showmarks.vim taglist.vim visual-increment.vim~/.vimrc 文件如下:if v:version >= 900 set scroll=1 let g:airline_scroll_size = 1 " 覆盖插件默认值 endif set number syntax on set showmode set showcmd set hlsearch set autoindent set smartindent set cindent set ts=4 set softtabstop=4 set shiftwidth=4 set noexpandtab set tabstop=4 set cursorline set cursorcolumn set lines=35 columns=100 set ruler set showmatch set wrap noremap <C-S-A> gggH<C-O>G inoremap <C-S-A> <C-O>gg<C-O>gH<C-O>G cnoremap <C-S-A> <C-C>gggH<C-O>G onoremap <C-S-A> <C-C>gggH<C-O>G snoremap <C-S-A> <C-C>gggH<C-O>G xnoremap <C-S-A> <C-C>ggVG noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <Esc>:update<CR>gi if has("clipboard") " CTRL-X and SHIFT-Del are Cut vnoremap <C-A-X> "+x vnoremap <S-Del> "+x " CTRL-C and CTRL-Insert are Copy vnoremap <C-A-C> "+y vnoremap <C-Insert> "+y " CTRL-V and SHIFT-Insert are Paste map <C-A-V> "+gP map <S-Insert> "+gP cmap <C-A-V> <C-R>+ cmap <S-Insert> <C-R>+ endif "source $VIMRUNTIME/mswin.vim behave mswin set guifont=Monospace\ 14 set linespace=4 colorscheme evening "unmap <C-V> "unmap <C-A> "unmap <C-C> "unmap <C-X> " copy paste map <C-Insert> "+y map <S-Insert> "+gP "Mouse could be controled when INSERT model set mouse=a set selection=exclusive set selectmode=mouse,key "============================= " showmarks setting "============================= " Enable ShowMarks let showmarks_enable = 1 " Show which marks let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" " Ignore help, quickfix, non-modifiable buffers let showmarks_ignore_type = "hqm" " Hilight lower & upper marks let showmarks_hlline_lower = 1 let showmarks_hlline_upper = 1 hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black "============================= " markbrowser setting "============================= nmap <silent> <leader>mk :MarksBrowser<cr> "Config for treeExplorer plugin let g:treeExplVertical=0 let g:treeExplDirSort=1 let g:treeExplWinSize=20 nmap vt :VSTreeExplore<cr> set autoread nmap <S-F> :call Verilog_format()<cr> function! Verilog_format() :w :silent execute '!~/.vim/tool/verible-verilog-format --column_limit=120 --indentation_spaces=4 --assignment_statement_alignment=align --named_port_alignment=align --port_declarations_alignment=align --module_net_variable_alignment=align --distribution_items_alignment=align --formal_parameters_indentation=indent --port_declarations_right_align_packed_dimensions=true --port_declarations_right_align_unpacked_dimensions=true --inplace=true --verify_convergence=true' expand('%:p') endfunction "ctrlp let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' "Grep hot key nnoremap <silent><C-F> :Grep -r<CR> "filetype, 'indent on' is necessary for smartindent filetype on filetype plugin on filetype indent on "header nmap <C-H> :call AddHeader()<cr> function! AddHeader() call append(0, '///////////////////////////////////////////////////////////////////') call append(1, '//copyright : Copyright © 2019-2023 INNOSTAR. All rights reserved') call append(2, '//project name: demo') call append(3, '//file name : '.expand('%:t')) call append(4, '//author : bennyhe') call append(5, '//abstraction : ') call append(6, '//date : '.strftime('%Y-%m-%d %H:%M:%S')) call append(7, '//version : 2.0') call append(8, '//platform : SuperBench 2.0') call append(9, '//history : created by bennyhe @'.strftime('%Y-%m-%d %H:%M:%S').expand(' v2.0')) call append(10, '///////////////////////////////////////////////////////////////////') endfunction "function nmap <C-L> :call AddFunction()<cr> function! AddFunction() call append(line(".")-1, ' /*****************************************************************') call append(line(".")-1, ' *') call append(line(".")-1, ' *****************************************************************/') endfunction set tags=tags; set tags+=~/.vim/tags/tags; set tags+=~/.vim/tags/tags_uvm; set tags+=~/.vim/tags/tags_vip; set autochdir "config for tlist plugin let Tlist_Ctags_Cmd = '/usr/bin/ctags' let Tlist_Use_Right_Window=0 let Tlist_Max_Tag_Length=1 let g:Tlist_Compact_Format=1 "let g:Tlist_WinHeight=5 let g:Tlist_WinWidth=15 let g:Tlist_Use_Horiz_Window=0 let g:Tlist_Show_One_File=1 "let g:Tlist_Exit_OnlyWindow=1 nmap tl :Tlist<cr> "terminal noremap <F8> :close!<cr> noremap <S-M-p> :sp<cr> noremap <S-M-q> :vs<cr> "noremap <F3> :belowright term ++rows=5 d:\msys64\msys2_shell.cmd -msys -defterm -no-start <cr> noremap <F3> :belowright term ++rows=5 powershell ubuntu2204.exe<cr> noremap <F4> :belowright term ++rows=5 powershell<cr> let b:match_words='\<begin\>:\<end\>' let g:rbpt_colorpairs = [ \ ['brown', 'RoyalBlue3'], \ ['Darkblue', 'SeaGreen3'], \ ['darkgray', 'DarkOrchid3'], \ ['darkgreen', 'firebrick3'], \ ['darkcyan', 'RoyalBlue3'], \ ['darkred', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['brown', 'firebrick3'], \ ['gray', 'RoyalBlue3'], \ ['black', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['Darkblue', 'firebrick3'], \ ['darkgreen', 'RoyalBlue3'], \ ['darkcyan', 'SeaGreen3'], \ ['darkred', 'DarkOrchid3'], \ ['red', 'firebrick3'], \ ] let g:rbpt_max = 16 let g:rbpt_loadcmd_toggle = 0 ""update ctags nmap <F10> :call UpdateCtags()<CR> function! UpdateCtags() let curdir=getcwd() while !filereadable("./tags") cd .. if getcwd() == "/" break endif endwhile if filewritable("./tags") silent !ctags -R --file-scope=yes --languages=systemverilog --links=yes --fields=+iaS --extra=+q TlistUpdate endif execute ":cd " . curdir endfunction nmap <F11> :call UpdateCtags_vip()<CR> function! UpdateCtags_vip() silent !ctags -R --languages=systemverilog -f ~/.vim/tags/tags_vip /data/ver/powervip/v2_0/ endfunction "autocmd BufWritePost *.sv,*.svh,*.v call UpdateCtags() "auto exce "set lines=999 columns=999 augroup initial autocmd! "autocmd VimEnter * VSTreeExplore "autocmd VimEnter * bo terminal ++rows=5 autocmd VimEnter * wincmd k autocmd VimEnter * Tlist autocmd VimEnter * wincmd h autocmd VimEnter * sp autocmd VimEnter * VSTreeExplore autocmd VimEnter * wincmd l autocmd VimEnter * q autocmd VimEnter * wincmd l au VimEnter * RainbowParenthesesToggleAll au Syntax * RainbowParenthesesLoadRound au Syntax * RainbowParenthesesLoadSquare au Syntax * RainbowParenthesesLoadBraces augroup END ":autocmd GUIEnter * VSTreeExplore "let g:airline_powerline_fonts = 1 let g:airline_theme = 'dark' let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#show_splits = 1 let g:airline#extensions#tabline#buffer_nr_show = 0 let g:airline#extensions#tabline#buffer_idx_mode = 3 let g:airline#extensions#tabline#show_tab_nr = 1 let g:airline#extensions#tabline#tab_nr_type = 1 let g:airline#extensions#branch#format =2 let g:airline_left_sep='>' let g:airline_inactive_collapse=0 let g:airline#extensions#tabline#formatter = 'unique_tail' let g:airline#extensions#tabline#buffer_idx_format = { \ '0': '0', \ '1': '1', \ '2': '2', \ '3': '3', \ '4': '4', \ '5': '5', \ '6': '6', \ '7': '7', \ '8': '8', \ '9': '9', \ ' ': ' ' \} let mapleader = "\<space>" let g:mapleader = "\<space>" set foldenable set foldmethod=marker set foldlevel=99 "" 代码折叠自定义快捷键 <leader>zz let g:FoldMethod = 0 map <leader>zz :call ToggleFold()<cr> fun! ToggleFold() if g:FoldMethod == 0 exe "normal! zM" let g:FoldMethod = 1 else exe "normal! zR" let g:FoldMethod = 0 endif endfun "set nocompatible "autocmd! bufwritepost .vimrc source % nmap <tab> :bn<cr> nmap <S-Tab> :bp<CR> "nmap <leader>1 :b 1<CR> nmap <leader>1 <Plug>AirlineSelectTab1 "{{{ nmap <leader>2 <Plug>AirlineSelectTab2 nmap <leader>3 <Plug>AirlineSelectTab3 nmap <leader>4 <Plug>AirlineSelectTab4 nmap <leader>5 <Plug>AirlineSelectTab5 nmap <leader>6 <Plug>AirlineSelectTab6 nmap <leader>7 <Plug>AirlineSelectTab7 nmap <leader>8 <Plug>AirlineSelectTab8 nmap <leader>9 <Plug>AirlineSelectTab9 nmap <leader>10 <Plug>AirlineSelectTab10 nmap <leader>11 <Plug>AirlineSelectTab11 nmap <leader>12 <Plug>AirlineSelectTab12 nmap <leader>13 <Plug>AirlineSelectTab13 nmap <leader>14 <Plug>AirlineSelectTab14 nmap <leader>15 <Plug>AirlineSelectTab15 nmap <leader>16 <Plug>AirlineSelectTab16 nmap <leader>17 <Plug>AirlineSelectTab17 nmap <leader>18 <Plug>AirlineSelectTab18 nmap <leader>19 <Plug>AirlineSelectTab19 nmap <leader>20 <Plug>AirlineSelectTab20 nmap <leader>21 <Plug>AirlineSelectTab21 nmap <leader>22 <Plug>AirlineSelectTab22 nmap <leader>23 <Plug>AirlineSelectTab23 nmap <leader>24 <Plug>AirlineSelectTab24 nmap <leader>25 <Plug>AirlineSelectTab25 nmap <leader>26 <Plug>AirlineSelectTab26 nmap <leader>27 <Plug>AirlineSelectTab27 nmap <leader>28 <Plug>AirlineSelectTab28 nmap <leader>29 <Plug>AirlineSelectTab29 nmap <leader>30 <Plug>AirlineSelectTab30 nmap <leader>31 <Plug>AirlineSelectTab31 nmap <leader>32 <Plug>AirlineSelectTab32 nmap <leader>33 <Plug>AirlineSelectTab33 nmap <leader>34 <Plug>AirlineSelectTab34 nmap <leader>35 <Plug>AirlineSelectTab35 nmap <leader>36 <Plug>AirlineSelectTab36 nmap <leader>37 <Plug>AirlineSelectTab37 nmap <leader>38 <Plug>AirlineSelectTab38 nmap <leader>39 <Plug>AirlineSelectTab39 nmap <leader>40 <Plug>AirlineSelectTab40 nmap <leader>41 <Plug>AirlineSelectTab41 nmap <leader>42 <Plug>AirlineSelectTab42 nmap <leader>43 <Plug>AirlineSelectTab43 nmap <leader>44 <Plug>AirlineSelectTab44 nmap <leader>45 <Plug>AirlineSelectTab45 nmap <leader>46 <Plug>AirlineSelectTab46 nmap <leader>47 <Plug>AirlineSelectTab47 nmap <leader>48 <Plug>AirlineSelectTab48 nmap <leader>49 <Plug>AirlineSelectTab49 nmap <leader>50 <Plug>AirlineSelectTab50 nmap <leader>51 <Plug>AirlineSelectTab51 nmap <leader>52 <Plug>AirlineSelectTab52 nmap <leader>53 <Plug>AirlineSelectTab53 nmap <leader>54 <Plug>AirlineSelectTab54 nmap <leader>55 <Plug>AirlineSelectTab55 nmap <leader>56 <Plug>AirlineSelectTab56 nmap <leader>57 <Plug>AirlineSelectTab57 nmap <leader>58 <Plug>AirlineSelectTab58 nmap <leader>59 <Plug>AirlineSelectTab59 nmap <leader>60 <Plug>AirlineSelectTab60 nmap <leader>61 <Plug>AirlineSelectTab61 nmap <leader>62 <Plug>AirlineSelectTab62 nmap <leader>63 <Plug>AirlineSelectTab63 nmap <leader>64 <Plug>AirlineSelectTab64 nmap <leader>65 <Plug>AirlineSelectTab65 nmap <leader>66 <Plug>AirlineSelectTab66 nmap <leader>67 <Plug>AirlineSelectTab67 nmap <leader>68 <Plug>AirlineSelectTab68 nmap <leader>69 <Plug>AirlineSelectTab69 nmap <leader>70 <Plug>AirlineSelectTab70 nmap <leader>71 <Plug>AirlineSelectTab71 nmap <leader>72 <Plug>AirlineSelectTab72 nmap <leader>73 <Plug>AirlineSelectTab73 nmap <leader>74 <Plug>AirlineSelectTab74 nmap <leader>75 <Plug>AirlineSelectTab75 nmap <leader>76 <Plug>AirlineSelectTab76 nmap <leader>77 <Plug>AirlineSelectTab77 nmap <leader>78 <Plug>AirlineSelectTab78 nmap <leader>79 <Plug>AirlineSelectTab79 nmap <leader>80 <Plug>AirlineSelectTab80 nmap <leader>81 <Plug>AirlineSelectTab81 nmap <leader>82 <Plug>AirlineSelectTab82 nmap <leader>83 <Plug>AirlineSelectTab83 nmap <leader>84 <Plug>AirlineSelectTab84 nmap <leader>85 <Plug>AirlineSelectTab85 nmap <leader>86 <Plug>AirlineSelectTab86 nmap <leader>87 <Plug>AirlineSelectTab87 nmap <leader>88 <Plug>AirlineSelectTab88 nmap <leader>89 <Plug>AirlineSelectTab89 nmap <leader>90 <Plug>AirlineSelectTab90 nmap <leader>91 <Plug>AirlineSelectTab91 nmap <leader>92 <Plug>AirlineSelectTab92 nmap <leader>93 <Plug>AirlineSelectTab93 nmap <leader>94 <Plug>AirlineSelectTab94 nmap <leader>95 <Plug>AirlineSelectTab95 nmap <leader>96 <Plug>AirlineSelectTab96 nmap <leader>97 <Plug>AirlineSelectTab97 nmap <leader>98 <Plug>AirlineSelectTab98 nmap <leader>99 <Plug>AirlineSelectTab99 "nmap <leader>- <Plug>AirlineSelectPrevTab "nmap <leader>+ <Plug>AirlineSelectNextTab "}}}
2025年10月10日
3 阅读
1 评论
0 点赞
2025-09-03
推荐5款Github上有趣的PHP项目
原创php中文网php中文网课程2022年11月16日17:00安徽1.Piwigo(一款开源在线相册应用)项目地址:https://github.com/Piwigo/Piwigo采用 PHP+MySQL 开发的管理照片的 Web 项目,它功能强大安装简单,拥有丰富的主题和灵活的插件,可轻松完成个性化定制。支持 iOS 和 Android 客户端,让你可以随时随地上传、管理照片。2.SyncMusic(在线弹幕点歌台)项目地址:https://github.com/kasuganosoras/SyncMusic基于 PHP Swoole 开发的在线弹幕点歌台。支持自由点歌、切歌、调整排序、删除指定音乐以及基础权限分级3.freenom(免费域名自动续期工具)项目地址:https://github.com/luolongfei/freenom因为顶级免费域名供应商 Freenom,提供的免费域名需要每年续期,该项目可以自动完成域名续期,让你轻松拥有免费的顶级域名。4.dootask(在线项目管理平台)项目地址:https://github.com/kuaifan/dootask功能包括任务分配、文档协作、即时 IM、文档协作、文件管理等5.server(开源云存储平台)项目地址:https://github.com/nextcloud/server开源云存储平台,功能齐全,可以用于搭建公司内部的云存储平台来自微信
2025年09月03日
0 阅读
0 评论
0 点赞
2025-08-28
5 分钟,教你从零快速编写一个油猴脚本!
1T服务圈儿2022年05月07日17:30江苏来源:经授权转自 AirPython(ID:AirPython)作者:星安果Tampermonkey,又称 Greasemonkey 油猴脚本,是一款免费的浏览器扩展,可用于管理用户脚本,它本质上是对浏览器接口的二次封装油猴脚本可用于更改页面布局样式、完成页面自动化、去广告、下载影视等功能,适用于主流的浏览器官网:https://www.tampermonkey.net/index.php介绍Tampermonkey 特点包含:内置的编辑器,可以非常方便地管理、编辑用户脚本支持自动更新检查功能标签中脚本运行状态速览可以通过压缩文件、云存储进行脚本备份及还原通过面板新建一个用户脚本,默认会生成一个模板,模板内容如下:模板中会预设部分元数据,用于定义脚本的名称、版本号、更新方式、运行页面、权限等功能常见的元数据包含:@name - 油猴脚本的名称 @namespace 脚本的命名空间,用于确定脚本的唯一性 @version 脚本的版本号,用于脚本的更新 @description 脚本的描述信息 @author 作者 @require 定义脚本运行之前需要引入的外部 JS,比如:jQuery @match 使用通配符执行需要匹配运行的网站地址 @exclude 排除匹配到的网站 @grant 指定脚本运行所属的权限 @connect 用于跨域访问时指定的目标网站域名 @run-at 指定脚本的运行时机 @icon 用于指定脚本的图标,可以设置为图片 URL 地址或 base64 的字符串常见 API油猴提供了很多强大的 API,用于操作缓存及窗口等,如果不需要使用这些 API,可以声明权限为 none,即:@grant none2-1 打印日志用于在控制台中打印日志,便于调试// 授权 @grant GM_log // 在控制台打印日志 GM_log("Hello World");2-2 缓存管理包含对缓存的新增、获取、删除,在使用之前我们都需要使用关键字 @grant 进行授权//授权 // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue //设置缓存 GM_setValue("hello", true); //获取缓存,默认值为true GM_getValue("hello", true); //删除缓存 GM_deleteValue("hello")2-3 缓存监听有时候,我们需要对缓存中的某个键的值进行监听,当发生变化时,调用一个方法事件比如,这里新增了一个监听器,对键名为 hello 的值进行监听// 授权 // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // 添加一个监听器 const listener_id = GM_addValueChangeListener('hello', function(name, old_value, new_value, remote){ if(hello == false){ //具体的调用方法 //.... } }) //监听监听器 GM_removeValueChangeListener(listener_id);2-4 打开一个标签格式:GM_openInTab(url, options)该 API 可用于打开一个新的标签页面其中,第一个参数用于指定新标签页面的 URL 地址,第二个参数用于指定页面展示方式及焦点停留页面// 授权 // @grant GM_openInTab // 打开新页面 var onpenNewTap = function (){ //打开百度页面 //active:true,新标签页获取页面焦点 //setParent :true:新标签页面关闭后,焦点重新回到源页面 newTap = GM_openInTab("https://www.baidu.com",{ active: true, setParent :true}); ...2-5 跨域请求在授予 GM_xmlhttpRequest 权限之后,就可以跨域发送请求了PS:第一次跨域请求时,会弹出请求对话框,需要选中允许,才能正常进行跨域请求// 授权 // @grant GM_xmlhttpRequest ... GM_xmlhttpRequest({ url:"http://www.httpbin.org/post", method:'POST', headers: { "content-type": "application/json" }, data:"", onerror:function(res){ console.log(res); }, onload:function(res){ console.log(res); } }); ...实战一下以某一新闻网站的自动加载下一页为例进行说明目标网站:IGh0dHBzOi8vd3d3LnBpbmd3ZXN0LmNvbS8=首先,我们使用关键字 @match 指定匹配的网站 URL,使用 @grant 设置权限 GM_log,使用关键字@run-at 指定执行时机为页面加载完成,即:document-end// ==UserScript== // @name 新闻查看更多 // @namespace com.xag.more // @version 0.1 // @license GNU General Public License v3.0 // @description 自动查看下一页 // @author xingag // @match 目标网站 // @icon 图标icon地址 // @grant GM_log // @run-at document-end // ==/UserScript== ...接着,添加一个定时任务,获取每一页底部的加载更多按钮最后,判断元素存在时,执行点击操作即可... (function() { 'use strict'; console.log("location.hostname:",location.hostname) if(location.hostname == "www.pingwest.com"){ setInterval(() => { const more_element = document.querySelector(".load-more-box").querySelector("a") if(more_element){ GM_log("元素存在,点击加载更多。。。") more_element.click(); } }, 2000); } })() ...总结本篇文章以一个简单的实例讲解了编写一个油猴脚本的完整流程为了提升开发效率,实际编写脚本可以使用 VS Code 编译器,安装插件 Tampermonkey Snippets 后再进行用户脚本开发当然,应对一些复杂的场景,可以借助一些优秀的脚手架框架https://github.com/kinyaying/wokoohttps://www.npmjs.com/package/create-tampermonkeyhttps://github.com/qianjiachun/vue3-tampermonkey来自微信
2025年08月28日
2 阅读
0 评论
0 点赞
2025-08-28
通过公网IP 云服务器做开源免费内网穿透推荐
本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。nps1.1 简介nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。一台有公网IP的服务器(VPS)运行服务端(NPS)一个或多个运行在内网的服务器或者PC运行客户端(NPC)1.2 特点Go语言编写支持跨平台支持多种协议的代理web管理端1.3 使用方法https://github.com/ehang-io/nps/releasesNPS安装配置找到自己服务器相应版本的server: cd ~ wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz tar xzvf linux_amd64_server.tar.gz cd ~/nps在nps目录下面会有一个nps可执行文件、conf配置目录和web网页目录,我们只需要修改conf/nps.conf即可:vim conf/nps.conf需要改一下#web下面的几个参数,web_host= 服务器IP或者域名 web_username= admin(登录用户名) web_password= 你的密码 web_port=8080(web管理端口)修改#bridge 可以更改 NPC的连接端口。比如我们拿到一台权限受限的服务器,有防火墙,可能只有部分端口(80,443)可以出网,就需要修改成出网端口。##bridge bridge_type=tcp bridge_port=443 # 修改连接端口 bridge_ip=0.0.0.0启动#Mac/Linux ./nps test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态 #Windows nps.exe test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态NPC./npc -server=你的IP:8024 -vkey=唯一验证密码 -type=tcp新建好客户端后,也可以在+中看到,详细的客户端连接命令:web管理端在客户端界面可以通过新增的方式添加客户端连接,每一个连接的vkey都是唯一区分的。每一个客户端,在建立连接后,都可以建立多个不同协议的隧道,这一个个隧道就是不同的代理了。通过不同的协议和端口就可以连接代理的内网机器。frp2.1 简介frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。2.2 特点客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。端口复用,多个服务通过同一个服务端端口暴露。跨平台,但是支持的比nps少一点多种插件,提供很多功能2.3 使用方法下载:https://github.com/fatedier/frp/releases以下内容摘自:https://segmentfault.com/a/11900000218768361. 通过 rdp 访问家里的机器1.修改 frps.ini 文件,为了安全起见,这里最好配置一下身份验证,服务端和客户端的 common 配置中的 token 参数一致则身份验证通过:# frps.ini [common] bind_port = 7000 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh启动 frps:./frps -c ./frps.ini修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 6000启动 frpc:./frpc -c ./frpc.ini5.通过 rdp 访问远程的机器,地址为:x.x.x.x:6000开机自启针对 Windows 系统,为了便于使用,可以配置一下开机的时候静默启动。1.在 frpc.exe 的同级目录创建一个 start_frpc.vbs:'start_frpc.vbs '请根据实际情况修改路径 CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",02.复制 start_frpc.vbs 文件,打开以下目录,注意将<USER_NAME>改为你的用户名:C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup3.鼠标右击,粘贴为快捷方式即可。通过 SSH 访问公司内网机器frps 的部署步骤同上。5.启动 frpc,配置如下: # frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 6.通过 SSH 访问内网机器,假设用户名为 test:ssh -oPort=6000 test@x.x.x.x通过自定义域名访问部署于内网的 Web 服务有时想要让其他人通过域名访问或者测试我们在本地搭建的 Web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过 frp 就可以实现这一功能,以下示例为 http 服务,https 服务配置方法相同, vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。8.修改 frps.ini 文件,设置 http 访问端口为 8080:# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh9.启动 frps:./frps -c ./frps.ini10.修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务对应的端口, 绑定自定义域名 www.yourdomain.com:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh [web] type = http local_port = 80 custom_domains = www.yourdomain.com11.启动 frpc:./frpc -c ./frpc.ini12.将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。13.通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上的 Web 服务。 对外提供简单的文件访问服务通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务。frps 的部署步骤同上。rps 的部署步骤同上。1.启动 frpc,启用 static_file 插件,配置如下:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证,请自行修改,要保证服务端与客户端一致 token = abcdefgh [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要对外暴露的文件目录 plugin_local_path = /tmp/file # 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc2.通过浏览器访问 http://x.x.x.x:6000/static/ 来查看位于 /tmp/file 目录下的文件,会要求输入已设置好的用户名和密码。常用功能统计面板(Dashboard)通过浏览器查看 frp 的状态以及代理统计信息展示。注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:[common] dashboard_port = 7500 # dashboard 用户名密码,默认都为 admin dashboard_user = admin dashboard_pwd = admin打开浏览器通过 http://[server_addr]:7500 访问 dashboard 界面,用户名密码默认为 admin。加密与压缩这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,通过设置 use_encryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 CPU 资源。[TLS从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在 frpc.ini 的 common 中配置 tls_enable = true 来启用此功能,安全性更高。为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。注意:启用此功能后除 xtcp 外,不需要再设置 use_encryption。代理限速目前支持在客户端的代理配置中设置代理级别的限速,限制单个 proxy 可以占用的带宽。# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 bandwidth_limit = 1MB在代理配置中增加 bandwidth_limit 字段启用此功能,目前仅支持 MB 和 KB 单位。范围端口映射在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。这一功能通过 range: 段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。例如要映射本地 6000-6005, 6007 这 6 个端口,主要配置如下:# frpc.ini [range:test_tcp] type = tcp local_ip = 127.0.0.1 local_port = 6000-6006,6007 remote_port = 6000-6006,6007实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7。ew3.1 简介EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。但是,现在工具已经不更新了。。。3.2 特点轻量级,C语言编写可以设置多级代理跨平台但是只支持Socks代理3.3 使用方法以下使用方法均摘自:http://rootkiter.com/EarthWorm/以下所有样例,如无特殊说明代理端口均为1080,服务均为SOCKSv5代理服务.该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。正向 SOCKS v5 服务器$ ./ew -s ssocksd -l 1080反弹 SOCKS v5 服务器这个操作具体分两步:a) 先在一台具有公网 ip 的主机A上运行以下命令:$ ./ew -s rcsocks -l 1080 -e 8888b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口$ ./ew -s rssocks -d 1.1.1.1 -e 8888成功。多级级联工具中自带的三条端口转发指令, 它们的参数格式分别为:$ ./ew -s lcx_listen -l 1080 -e 8888 $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999 $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如 SOCKS v5。首先提供两个“二级级联”本地SOCKS测试样例:a) lcx_tran 的用法$ ./ew -s ssocksd -l 9999$ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999b) lcx_listen、lcx_slave 的用法$ ./ew -s lcx_listen -l 1080 -e 8888$ ./ew -s ssocksd -l 9999$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999再提供一个“三级级联”的本地SOCKS测试用例以供参考$ ./ew -s rcsocks -l 1080 -e 8888$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999$ ./ew -s lcx_listen -l 9999 -e 7777$ ./ew -s rssocks -d 127.0.0.1 -e 7777数据流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocksngrok4.1 简介ngrok 是一个反向代理,通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放,所以ngrok可以很方便地协助服务端程序测试。4.2 特点官方维护,一般较为稳定跨平台,闭源有流量记录和重发功能4.3 使用方法进入ngrok官网(https://ngrok.com/),注册ngrok账号并下载ngrok;根据官网给定的授权码,运行如下授权命令;./ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_**./ngrok http 80即可将机器的80端口http服务暴露到公网,并且会提供一个公网域名。可以通过官网的UI界面查看数据包和流量等等(但是要付费==、)还可以通过一些命令将内网的文件和其他TCP服务 暴露到公网中。有授权的设置文件共享ngrok http -auth="user:password" file:///Users/alan/share无授权的设置文件共享ngrok http "file:///C:\Users\alan\Public Folder"将主机的3389的TCP端口暴露到公网ngrok tcp 3389更多使用方法参考:https://ngrok.com/docs来自微信
2025年08月28日
1 阅读
0 评论
0 点赞
1
2
3
4
...
9