From 2c5e5ca4a1e3c15508e0911cb613b692a80d2f49 Mon Sep 17 00:00:00 2001 From: ma6174 Date: Sat, 28 Jul 2012 20:52:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=97=E5=A4=9A=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E7=89=B9=E5=88=AB=E6=98=AF=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=B3=95=E5=92=8Cpython=E5=BC=80=E5=8F=91=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .netrwhist | 10 + .vimrc | 232 +- autoload/acp.vim | 431 + autoload/pythoncomplete.vim | 625 + doc/NERD_tree.txt | 1291 + doc/tags | 7 + ftplugin/python/pyflakes.vim | 321 + ftplugin/python/pyflakes/LICENSE | 21 + ftplugin/python/pyflakes/NEWS.txt | 29 + ftplugin/python/pyflakes/bin/pyflakes | 4 + .../lib.linux-x86_64-2.7/pyflakes/__init__.py | 2 + .../lib.linux-x86_64-2.7/pyflakes/checker.py | 625 + .../lib.linux-x86_64-2.7/pyflakes/messages.py | 96 + .../pyflakes/scripts/__init__.py | 0 .../pyflakes/scripts/pyflakes.py | 90 + .../pyflakes/test/__init__.py | 0 .../pyflakes/test/harness.py | 27 + .../pyflakes/test/test_imports.py | 673 + .../pyflakes/test/test_other.py | 575 + .../pyflakes/test/test_script.py | 185 + .../pyflakes/test/test_undefined_names.py | 265 + .../pyflakes/build/scripts-2.7/pyflakes | 4 + ftplugin/python/pyflakes/pyflakes/__init__.py | 2 + .../python/pyflakes/pyflakes/__init__.pyc | Bin 0 -> 182 bytes ftplugin/python/pyflakes/pyflakes/checker.py | 625 + ftplugin/python/pyflakes/pyflakes/checker.pyc | Bin 0 -> 22704 bytes ftplugin/python/pyflakes/pyflakes/messages.py | 96 + .../python/pyflakes/pyflakes/messages.pyc | Bin 0 -> 6462 bytes .../pyflakes/pyflakes/scripts/__init__.py | 0 .../pyflakes/pyflakes/scripts/pyflakes.py | 90 + .../python/pyflakes/pyflakes/test/__init__.py | 0 .../python/pyflakes/pyflakes/test/harness.py | 27 + .../pyflakes/pyflakes/test/test_imports.py | 673 + .../pyflakes/pyflakes/test/test_other.py | 575 + .../pyflakes/pyflakes/test/test_script.py | 185 + .../pyflakes/test/test_undefined_names.py | 265 + ftplugin/python/pyflakes/setup.py | 28 + plugin/NERD_tree.vim | 4017 +++ plugin/acp.vim | 170 + plugin/autoproto.vim | 751 + plugin/calendar.vim | 1328 + plugin/cscope_maps.vim | 165 + plugin/echofunc.vim | 557 + plugin/fencview.vim | 1351 + plugin/libvimim.dll | Bin 0 -> 57022 bytes plugin/libvimim.so | Bin 0 -> 12172 bytes plugin/python.vim | 294 + plugin/python_fn.vim | 446 + plugin/supertab.vim | 211 + plugin/taglist.vim | 4546 ++++ plugin/txt.vim | 115 + plugin/vimim.cjk.txt | 20902 ++++++++++++++++ plugin/vimim.txt | 3523 +++ plugin/vimim.vim | 3199 +++ syntax/nerdtree.vim | 88 + syntax/python.vim | 374 + 56 files changed, 50004 insertions(+), 112 deletions(-) create mode 100644 .netrwhist create mode 100644 autoload/acp.vim create mode 100644 autoload/pythoncomplete.vim create mode 100644 doc/NERD_tree.txt create mode 100644 doc/tags create mode 100644 ftplugin/python/pyflakes.vim create mode 100644 ftplugin/python/pyflakes/LICENSE create mode 100644 ftplugin/python/pyflakes/NEWS.txt create mode 100644 ftplugin/python/pyflakes/bin/pyflakes create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/__init__.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/checker.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/messages.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/__init__.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/pyflakes.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/__init__.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/harness.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_imports.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_other.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_script.py create mode 100644 ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_undefined_names.py create mode 100755 ftplugin/python/pyflakes/build/scripts-2.7/pyflakes create mode 100644 ftplugin/python/pyflakes/pyflakes/__init__.py create mode 100644 ftplugin/python/pyflakes/pyflakes/__init__.pyc create mode 100644 ftplugin/python/pyflakes/pyflakes/checker.py create mode 100644 ftplugin/python/pyflakes/pyflakes/checker.pyc create mode 100644 ftplugin/python/pyflakes/pyflakes/messages.py create mode 100644 ftplugin/python/pyflakes/pyflakes/messages.pyc create mode 100644 ftplugin/python/pyflakes/pyflakes/scripts/__init__.py create mode 100644 ftplugin/python/pyflakes/pyflakes/scripts/pyflakes.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/__init__.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/harness.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/test_imports.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/test_other.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/test_script.py create mode 100644 ftplugin/python/pyflakes/pyflakes/test/test_undefined_names.py create mode 100644 ftplugin/python/pyflakes/setup.py create mode 100644 plugin/NERD_tree.vim create mode 100644 plugin/acp.vim create mode 100644 plugin/autoproto.vim create mode 100644 plugin/calendar.vim create mode 100644 plugin/cscope_maps.vim create mode 100644 plugin/echofunc.vim create mode 100644 plugin/fencview.vim create mode 100644 plugin/libvimim.dll create mode 100644 plugin/libvimim.so create mode 100644 plugin/python.vim create mode 100644 plugin/python_fn.vim create mode 100644 plugin/supertab.vim create mode 100644 plugin/taglist.vim create mode 100644 plugin/txt.vim create mode 100644 plugin/vimim.cjk.txt create mode 100644 plugin/vimim.txt create mode 100644 plugin/vimim.vim create mode 100644 syntax/nerdtree.vim create mode 100644 syntax/python.vim diff --git a/.netrwhist b/.netrwhist new file mode 100644 index 00000000..3928b28c --- /dev/null +++ b/.netrwhist @@ -0,0 +1,10 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhist_cnt =8 +let g:netrw_dirhist_1='/media/M_fM__VM_0M_eM__MM_7' +let g:netrw_dirhist_2='/media' +let g:netrw_dirhist_3='/media/M_hM_5M__DM_fM__VM__Y' +let g:netrw_dirhist_4='/media' +let g:netrw_dirhist_5='/media/M_hM_5M__DM_fM__VM__Y' +let g:netrw_dirhist_6='/media/M_hM_5M__DM_fM__VM__Y/desktop' +let g:netrw_dirhist_7='/media/M_hM_5M__DM_fM__VM__Y' +let g:netrw_dirhist_8='/media' diff --git a/.vimrc b/.vimrc index b99eeca9..856796f8 100644 --- a/.vimrc +++ b/.vimrc @@ -1,69 +1,67 @@ -map :call SaveInputData() -func! SaveInputData() -exec "tabnew" -exec 'normal "+gP' -exec "w! /tmp/input_data" -endfunc - -let g:pydiction_location = '~/.vim/after/complete-dict' -let g:pydiction_menu_height = 20 -let Tlist_Ctags_Cmd='/usr/local/bin/ctags' -let g:miniBufExplMapWindowNavVim = 1 -let g:miniBufExplMapWindowNavArrows = 1 -let g:miniBufExplMapCTabSwitchBufs = 1 -let g:miniBufExplModSelTarget = 1 - - - - - -"set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 -"set termencoding=utf-8 -"set encoding=utf-8 -"set fileencodings=ucs-bom,utf-8,cp936 -"set fileencoding=utf-8 - """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 显示相关 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -"set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示 -"winpos 5 5 " 设定窗口位置 -"set lines=40 columns=155 " 设定窗口大小 -"set nu " 显示行号 +set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示 set go= " 不要图形按钮 "color asmanian2 " 设置背景主题 "set guifont=Courier_New:h10:cANSI " 设置字体 -"syntax on " 语法高亮 autocmd InsertLeave * se nocul " 用浅色高亮当前行 autocmd InsertEnter * se cul " 用浅色高亮当前行 -"set ruler " 显示标尺 +set ruler " 显示标尺 set showcmd " 输入的命令显示出来,看的清楚些 -"set cmdheight=1 " 命令行(在状态行下)的高度,设置为1 "set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议) -"set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 -set novisualbell " 不要闪烁(不明白) +set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容 -set laststatus=1 " 启动显示状态行(1),总是显示状态行(2) -set foldenable " 允许折叠 +set laststatus=2 " 启动显示状态行(1),总是显示状态行(2) +"set foldenable " 允许折叠 set foldmethod=manual " 手动折叠 -"set background=dark "背景使用黑色 set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 " 显示中文帮助 if version >= 603 set helplang=cn set encoding=utf-8 endif -" 设置配色方案 -"colorscheme murphy -"字体 -"if (has("gui_running")) -" set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 -"endif +" 自动缩进 +set autoindent +set cindent +" Tab键的宽度 +set tabstop=4 +" 统一缩进为4 +set softtabstop=4 +set shiftwidth=4 +" 不要用空格代替制表符 +set noexpandtab +" 在行和段开始处使用制表符 +set smarttab +" 显示行号 +set number +" 历史记录数 +set history=1000 +"搜索逐字符高亮 +set hlsearch +set incsearch +"语言设置 +set langmenu=zh_CN.UTF-8 +set helplang=cn +" 总是显示状态行 +set cmdheight=2 +" 侦测文件类型 +filetype on +" 载入文件类型插件 +filetype plugin on +" 为特定文件类型载入相关缩进文件 +filetype indent on +" 保存全局变量 +set viminfo+=! +" 带有如下符号的单词不要被换行分割 +set iskeyword+=_,$,@,%,#,- +" 字符间插入的像素行数目 + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""新文件标题 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "新建.c,.h,.sh,.java文件,自动插入文件头 -autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" +autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java,*.py exec ":call SetTitle()" ""定义函数SetTitle,自动插入文件头 func SetTitle() "如果文件类型为.sh文件 @@ -76,6 +74,10 @@ func SetTitle() call append(line(".")+4, "\#########################################################################") call append(line(".")+5, "\#!/bin/bash") call append(line(".")+6, "") + elseif &filetype == 'python' + call setline(1,"#!/usr/bin/env python") + call append(line("."),"#coding=utf-8") + call append(line(".")+1, "") else call setline(1, "/*************************************************************************") call append(line("."), " > File Name: ".expand("%")) @@ -101,14 +103,14 @@ func SetTitle() "新建文件后,自动定位到文件末尾 autocmd BufNewFile * normal G endfunc + + + + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "键盘命令 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -nmap w :w! -nmap f :find - -" 映射全选+复制 ctrl+a +:nmap :Tlist map ggVGY map! ggVGY map gg=G @@ -118,8 +120,6 @@ vmap "+y nnoremap :g/^\s*$/d "比较文件 nnoremap :vert diffsplit -"新建标签 -map :tabnew "列出当前目录文件 map :tabnew . "打开树状文件目录 @@ -139,9 +139,8 @@ func! CompileRunGcc() exec "!java %<" elseif &filetype == 'sh' :!./% - elseif &filetype == 'py' + elseif &filetype == 'python' exec "!python %" - exec "!python %<" endif endfunc "C,C++的调试 @@ -151,6 +150,13 @@ func! Rungdb() exec "!g++ % -g -o %<" exec "!gdb ./%<" endfunc + + + + + + + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ""实用设置 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -163,11 +169,7 @@ set completeopt=preview,menu "允许插件 filetype plugin on "共享剪贴板 -set clipboard+=unnamed -"从不备份 -set nobackup -"make 运行 -:set makeprg=g++\ -Wall\ \ % +"set clipboard+=unnamed "自动保存 set autowrite set ruler " 打开状态栏标尺 @@ -175,70 +177,24 @@ set cursorline " 突出显示当前行 set magic " 设置魔术 set guioptions-=T " 隐藏工具栏 set guioptions-=m " 隐藏菜单栏 -"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ -" 设置在状态行显示的信息 set foldcolumn=0 set foldmethod=indent set foldlevel=3 -set foldenable " 开始折叠 " 不要使用vi的键盘模式,而是vim自己的 set nocompatible -" 语法高亮 -set syntax=on " 去掉输入错误的提示声音 set noeb " 在处理未保存或只读文件的时候,弹出确认 set confirm -" 自动缩进 -set autoindent -set cindent -" Tab键的宽度 -set tabstop=4 -" 统一缩进为4 -set softtabstop=4 -set shiftwidth=4 -" 不要用空格代替制表符 -set noexpandtab -" 在行和段开始处使用制表符 -set smarttab -" 显示行号 -set number -" 历史记录数 -set history=1000 "禁止生成临时文件 set nobackup set noswapfile "搜索忽略大小写 set ignorecase -"搜索逐字符高亮 -set hlsearch -set incsearch -"行内替换 -set gdefault -"编码设置 -set enc=utf-8 -set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 -"语言设置 -set langmenu=zh_CN.UTF-8 -set helplang=cn -" 我的状态行显示的内容(包括文件类型和解码) -"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} -"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%] -" 总是显示状态行 -set laststatus=2 -" 命令行(在状态行下)的高度,默认为1,这里是2 -set cmdheight=2 -" 侦测文件类型 -filetype on -" 载入文件类型插件 -filetype plugin on -" 为特定文件类型载入相关缩进文件 -filetype indent on -" 保存全局变量 -set viminfo+=! -" 带有如下符号的单词不要被换行分割 -set iskeyword+=_,$,@,%,#,- -" 字符间插入的像素行数目 + + + + set linespace=0 " 增强模式中的命令行自动完成操作 set wildmenu @@ -292,13 +248,21 @@ let Tlist_Compart_Format = 1 " 压缩方式 let Tlist_Exist_OnlyWindow = 1 " 如果只有一个buffer,kill窗口也kill掉buffer let Tlist_File_Fold_Auto_Close = 0 " 不要关闭其他文件的tags let Tlist_Enable_Fold_Column = 0 " 不要显示折叠树 -autocmd FileType java set tags+=D:\tools\java\tags -"autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags "let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的 "设置tags -set tags=tags +"set tags=tags "set autochdir + + + + + + + + + + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "其他东东 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -307,7 +271,7 @@ let Tlist_Auto_Open=1 """""""""""""""""""""""""""""" " Tag list (ctags) """""""""""""""""""""""""""""""" -let Tlist_Ctags_Cmd = '/usr/bin/ctags' +let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口 @@ -316,3 +280,47 @@ let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplModSelTarget = 1 + + + + + + + + + + + + +"输入法 +:let g:vimim_map='c-/' +:let g:vimim_cloud='qq' " QQ云输入 +:let g:vimim_punctuation=0 " 不用中文标点 +:set pastetoggle= + + +"python补全 +let g:pydiction_location = '~/.vim/after/complete-dict' +let g:pydiction_menu_height = 20 +let Tlist_Ctags_Cmd='/usr/local/bin/ctags' +let g:miniBufExplMapWindowNavVim = 1 +let g:miniBufExplMapWindowNavArrows = 1 +let g:miniBufExplMapCTabSwitchBufs = 1 +let g:miniBufExplModSelTarget = 1 + + + + +set iskeyword+=. +set fileencodings=utf-8 +set termencoding=utf-8 +set encoding=utf8 +set fileencoding=utf8 +set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030 +let &termencoding=&encoding + + + +autocmd FileType python set omnifunc=pythoncomplete#Complete + + diff --git a/autoload/acp.vim b/autoload/acp.vim new file mode 100644 index 00000000..827bbccf --- /dev/null +++ b/autoload/acp.vim @@ -0,0 +1,431 @@ +"============================================================================= +" Copyright (c) 2007-2009 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if exists('g:loaded_autoload_acp') || v:version < 702 + finish +endif +let g:loaded_autoload_acp = 1 + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS: {{{1 + +" +function acp#enable() + call acp#disable() + + augroup AcpGlobalAutoCommand + autocmd! + autocmd InsertEnter * unlet! s:posLast s:lastUncompletable + autocmd InsertLeave * call s:finishPopup(1) + augroup END + + if g:acp_mappingDriven + call s:mapForMappingDriven() + else + autocmd AcpGlobalAutoCommand CursorMovedI * call s:feedPopup() + endif + + nnoremap i i=feedPopup() + nnoremap a a=feedPopup() + nnoremap R R=feedPopup() +endfunction + +" +function acp#disable() + call s:unmapForMappingDriven() + augroup AcpGlobalAutoCommand + autocmd! + augroup END + nnoremap i | nunmap i + nnoremap a | nunmap a + nnoremap R | nunmap R +endfunction + +" +function acp#lock() + let s:lockCount += 1 +endfunction + +" +function acp#unlock() + let s:lockCount -= 1 + if s:lockCount < 0 + let s:lockCount = 0 + throw "AutoComplPop: not locked" + endif +endfunction + +" +function acp#meetsForSnipmate(context) + if g:acp_behaviorSnipmateLength < 0 + return 0 + endif + let matches = matchlist(a:context, '\(^\|\s\|\<\)\(\u\{' . + \ g:acp_behaviorSnipmateLength . ',}\)$') + return !empty(matches) && !empty(s:getMatchingSnipItems(matches[2])) +endfunction + +" +function acp#meetsForKeyword(context) + if g:acp_behaviorKeywordLength < 0 + return 0 + endif + let matches = matchlist(a:context, '\(\k\{' . g:acp_behaviorKeywordLength . ',}\)$') + if empty(matches) + return 0 + endif + for ignore in g:acp_behaviorKeywordIgnores + if stridx(ignore, matches[1]) == 0 + return 0 + endif + endfor + return 1 +endfunction + +" +function acp#meetsForFile(context) + if g:acp_behaviorFileLength < 0 + return 0 + endif + if has('win32') || has('win64') + let separator = '[/\\]' + else + let separator = '\/' + endif + if a:context !~ '\f' . separator . '\f\{' . g:acp_behaviorFileLength . ',}$' + return 0 + endif + return a:context !~ '[*/\\][/\\]\f*$\|[^[:print:]]\f*$' +endfunction + +" +function acp#meetsForRubyOmni(context) + if !has('ruby') + return 0 + endif + if g:acp_behaviorRubyOmniMethodLength >= 0 && + \ a:context =~ '[^. \t]\(\.\|::\)\k\{' . + \ g:acp_behaviorRubyOmniMethodLength . ',}$' + return 1 + endif + if g:acp_behaviorRubyOmniSymbolLength >= 0 && + \ a:context =~ '\(^\|[^:]\):\k\{' . + \ g:acp_behaviorRubyOmniSymbolLength . ',}$' + return 1 + endif + return 0 +endfunction + +" +function acp#meetsForPythonOmni(context) + return has('python') && g:acp_behaviorPythonOmniLength >= 0 && + \ a:context =~ '\k\.\k\{' . g:acp_behaviorPythonOmniLength . ',}$' +endfunction + +" +function acp#meetsForPerlOmni(context) + return g:acp_behaviorPerlOmniLength >= 0 && + \ a:context =~ '\w->\k\{' . g:acp_behaviorPerlOmniLength . ',}$' +endfunction + +" +function acp#meetsForXmlOmni(context) + return g:acp_behaviorXmlOmniLength >= 0 && + \ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' . + \ g:acp_behaviorXmlOmniLength . ',}$' +endfunction + +" +function acp#meetsForHtmlOmni(context) + return g:acp_behaviorHtmlOmniLength >= 0 && + \ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' . + \ g:acp_behaviorHtmlOmniLength . ',}$' +endfunction + +" +function acp#meetsForCssOmni(context) + if g:acp_behaviorCssOmniPropertyLength >= 0 && + \ a:context =~ '\(^\s\|[;{]\)\s*\k\{' . + \ g:acp_behaviorCssOmniPropertyLength . ',}$' + return 1 + endif + if g:acp_behaviorCssOmniValueLength >= 0 && + \ a:context =~ '[:@!]\s*\k\{' . + \ g:acp_behaviorCssOmniValueLength . ',}$' + return 1 + endif + return 0 +endfunction + +" +function acp#completeSnipmate(findstart, base) + if a:findstart + let s:posSnipmateCompletion = len(matchstr(s:getCurrentText(), '.*\U')) + return s:posSnipmateCompletion + endif + let lenBase = len(a:base) + let items = filter(GetSnipsInCurrentScope(), + \ 'strpart(v:key, 0, lenBase) ==? a:base') + return map(sort(items(items)), 's:makeSnipmateItem(v:val[0], v:val[1])') +endfunction + +" +function acp#onPopupCloseSnipmate() + let word = s:getCurrentText()[s:posSnipmateCompletion :] + for trigger in keys(GetSnipsInCurrentScope()) + if word ==# trigger + call feedkeys("\=TriggerSnippet()\", "n") + return 0 + endif + endfor + return 1 +endfunction + +" +function acp#onPopupPost() + " to clear = expression on command-line + echo '' + if pumvisible() + inoremap acp#onBs() + inoremap acp#onBs() + " a command to restore to original text and select the first match + return (s:behavsCurrent[s:iBehavs].command =~# "\" ? "\\" + \ : "\\") + endif + let s:iBehavs += 1 + if len(s:behavsCurrent) > s:iBehavs + call s:setCompletefunc() + return printf("\%s\=acp#onPopupPost()\", + \ s:behavsCurrent[s:iBehavs].command) + else + let s:lastUncompletable = { + \ 'word': s:getCurrentWord(), + \ 'commands': map(copy(s:behavsCurrent), 'v:val.command')[1:], + \ } + call s:finishPopup(0) + return "\" + endif +endfunction + +" +function acp#onBs() + " using "matchstr" and not "strpart" in order to handle multi-byte + " characters + if call(s:behavsCurrent[s:iBehavs].meets, + \ [matchstr(s:getCurrentText(), '.*\ze.')]) + return "\" + endif + return "\\" +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS: {{{1 + +" +function s:mapForMappingDriven() + call s:unmapForMappingDriven() + let s:keysMappingDriven = [ + \ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + \ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + \ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + \ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + \ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + \ '-', '_', '~', '^', '.', ',', ':', '!', '#', '=', '%', '$', '@', '<', '>', '/', '\', + \ '', '', '', ] + for key in s:keysMappingDriven + execute printf('inoremap %s %s=feedPopup()', + \ key, key) + endfor +endfunction + +" +function s:unmapForMappingDriven() + if !exists('s:keysMappingDriven') + return + endif + for key in s:keysMappingDriven + execute 'iunmap ' . key + endfor + let s:keysMappingDriven = [] +endfunction + +" +function s:setTempOption(group, name, value) + call extend(s:tempOptionSet[a:group], { a:name : eval('&' . a:name) }, 'keep') + execute printf('let &%s = a:value', a:name) +endfunction + +" +function s:restoreTempOptions(group) + for [name, value] in items(s:tempOptionSet[a:group]) + execute printf('let &%s = value', name) + endfor + let s:tempOptionSet[a:group] = {} +endfunction + +" +function s:getCurrentWord() + return matchstr(s:getCurrentText(), '\k*$') +endfunction + +" +function s:getCurrentText() + return strpart(getline('.'), 0, col('.') - 1) +endfunction + +" +function s:getPostText() + return strpart(getline('.'), col('.') - 1) +endfunction + +" +function s:isModifiedSinceLastCall() + if exists('s:posLast') + let posPrev = s:posLast + let nLinesPrev = s:nLinesLast + let textPrev = s:textLast + endif + let s:posLast = getpos('.') + let s:nLinesLast = line('$') + let s:textLast = getline('.') + if !exists('posPrev') + return 1 + elseif posPrev[1] != s:posLast[1] || nLinesPrev != s:nLinesLast + return (posPrev[1] - s:posLast[1] == nLinesPrev - s:nLinesLast) + elseif textPrev ==# s:textLast + return 0 + elseif posPrev[2] > s:posLast[2] + return 1 + elseif has('gui_running') && has('multi_byte') + " NOTE: auto-popup causes a strange behavior when IME/XIM is working + return posPrev[2] + 1 == s:posLast[2] + endif + return posPrev[2] != s:posLast[2] +endfunction + +" +function s:makeCurrentBehaviorSet() + let modified = s:isModifiedSinceLastCall() + if exists('s:behavsCurrent[s:iBehavs].repeat') && s:behavsCurrent[s:iBehavs].repeat + let behavs = [ s:behavsCurrent[s:iBehavs] ] + elseif exists('s:behavsCurrent[s:iBehavs]') + return [] + elseif modified + let behavs = copy(exists('g:acp_behavior[&filetype]') + \ ? g:acp_behavior[&filetype] + \ : g:acp_behavior['*']) + else + return [] + endif + let text = s:getCurrentText() + call filter(behavs, 'call(v:val.meets, [text])') + let s:iBehavs = 0 + if exists('s:lastUncompletable') && + \ stridx(s:getCurrentWord(), s:lastUncompletable.word) == 0 && + \ map(copy(behavs), 'v:val.command') ==# s:lastUncompletable.commands + let behavs = [] + else + unlet! s:lastUncompletable + endif + return behavs +endfunction + +" +function s:feedPopup() + " NOTE: CursorMovedI is not triggered while the popup menu is visible. And + " it will be triggered when popup menu is disappeared. + if s:lockCount > 0 || pumvisible() || &paste + return '' + endif + if exists('s:behavsCurrent[s:iBehavs].onPopupClose') + if !call(s:behavsCurrent[s:iBehavs].onPopupClose, []) + call s:finishPopup(1) + return '' + endif + endif + let s:behavsCurrent = s:makeCurrentBehaviorSet() + if empty(s:behavsCurrent) + call s:finishPopup(1) + return '' + endif + " In case of dividing words by symbols (e.g. "for(int", "ab==cd") while a + " popup menu is visible, another popup is not available unless input + " or try popup once. So first completion is duplicated. + call insert(s:behavsCurrent, s:behavsCurrent[s:iBehavs]) + call s:setTempOption(s:GROUP0, 'spell', 0) + call s:setTempOption(s:GROUP0, 'completeopt', 'menuone' . (g:acp_completeoptPreview ? ',preview' : '')) + call s:setTempOption(s:GROUP0, 'complete', g:acp_completeOption) + call s:setTempOption(s:GROUP0, 'ignorecase', g:acp_ignorecaseOption) + " NOTE: With CursorMovedI driven, Set 'lazyredraw' to avoid flickering. + " With Mapping driven, set 'nolazyredraw' to make a popup menu visible. + call s:setTempOption(s:GROUP0, 'lazyredraw', !g:acp_mappingDriven) + " NOTE: 'textwidth' must be restored after . + call s:setTempOption(s:GROUP1, 'textwidth', 0) + call s:setCompletefunc() + call feedkeys(s:behavsCurrent[s:iBehavs].command . "\=acp#onPopupPost()\", 'n') + return '' " this function is called by = +endfunction + +" +function s:finishPopup(fGroup1) + inoremap | iunmap + inoremap | iunmap + let s:behavsCurrent = [] + call s:restoreTempOptions(s:GROUP0) + if a:fGroup1 + call s:restoreTempOptions(s:GROUP1) + endif +endfunction + +" +function s:setCompletefunc() + if exists('s:behavsCurrent[s:iBehavs].completefunc') + call s:setTempOption(0, 'completefunc', s:behavsCurrent[s:iBehavs].completefunc) + endif +endfunction + +" +function s:makeSnipmateItem(key, snip) + if type(a:snip) == type([]) + let descriptions = map(copy(a:snip), 'v:val[0]') + let snipFormatted = '[MULTI] ' . join(descriptions, ', ') + else + let snipFormatted = substitute(a:snip, '\(\n\|\s\)\+', ' ', 'g') + endif + return { + \ 'word': a:key, + \ 'menu': strpart(snipFormatted, 0, 80), + \ } +endfunction + +" +function s:getMatchingSnipItems(base) + let key = a:base . "\n" + if !exists('s:snipItems[key]') + let s:snipItems[key] = items(GetSnipsInCurrentScope()) + call filter(s:snipItems[key], 'strpart(v:val[0], 0, len(a:base)) ==? a:base') + call map(s:snipItems[key], 's:makeSnipmateItem(v:val[0], v:val[1])') + endif + return s:snipItems[key] +endfunction + +" }}}1 +"============================================================================= +" INITIALIZATION {{{1 + +let s:GROUP0 = 0 +let s:GROUP1 = 1 +let s:lockCount = 0 +let s:behavsCurrent = [] +let s:iBehavs = 0 +let s:tempOptionSet = [{}, {}] +let s:snipItems = {} + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/pythoncomplete.vim b/autoload/pythoncomplete.vim new file mode 100644 index 00000000..57add71c --- /dev/null +++ b/autoload/pythoncomplete.vim @@ -0,0 +1,625 @@ +"pythoncomplete.vim - Omni Completion for python +" Maintainer: Aaron Griffin +" Version: 0.9 +" Last Updated: 18 Jun 2009 +" +" Changes +" TODO: +" 'info' item output can use some formatting work +" Add an "unsafe eval" mode, to allow for return type evaluation +" Complete basic syntax along with import statements +" i.e. "import url" +" Continue parsing on invalid line?? +" +" v 0.9 +" * Fixed docstring parsing for classes and functions +" * Fixed parsing of *args and **kwargs type arguments +" * Better function param parsing to handle things like tuples and +" lambda defaults args +" +" v 0.8 +" * Fixed an issue where the FIRST assignment was always used instead of +" using a subsequent assignment for a variable +" * Fixed a scoping issue when working inside a parameterless function +" +" +" v 0.7 +" * Fixed function list sorting (_ and __ at the bottom) +" * Removed newline removal from docs. It appears vim handles these better in +" recent patches +" +" v 0.6: +" * Fixed argument completion +" * Removed the 'kind' completions, as they are better indicated +" with real syntax +" * Added tuple assignment parsing (whoops, that was forgotten) +" * Fixed import handling when flattening scope +" +" v 0.5: +" Yeah, I skipped a version number - 0.4 was never public. +" It was a bugfix version on top of 0.3. This is a complete +" rewrite. +" + +if !has('python') + echo "Error: Required vim compiled with +python" + finish +endif + +function! pythoncomplete#Complete(findstart, base) + "findstart = 1 when we need to get the text length + if a:findstart == 1 + let line = getline('.') + let idx = col('.') + while idx > 0 + let idx -= 1 + let c = line[idx] + if c =~ '\w' + continue + elseif ! c =~ '\.' + let idx = -1 + break + else + break + endif + endwhile + + return idx + "findstart = 0 when we need to return the list of completions + else + "vim no longer moves the cursor upon completion... fix that + let line = getline('.') + let idx = col('.') + let cword = '' + while idx > 0 + let idx -= 1 + let c = line[idx] + if c =~ '\w' || c =~ '\.' + let cword = c . cword + continue + elseif strlen(cword) > 0 || idx == 0 + break + endif + endwhile + execute "python vimcomplete('" . cword . "', '" . a:base . "')" + return g:pythoncomplete_completions + endif +endfunction + +function! s:DefPython() +python << PYTHONEOF +import sys, tokenize, cStringIO, types +from token import NAME, DEDENT, NEWLINE, STRING + +debugstmts=[] +def dbg(s): debugstmts.append(s) +def showdbg(): + for d in debugstmts: print "DBG: %s " % d + +def vimcomplete(context,match): + global debugstmts + debugstmts = [] + try: + import vim + def complsort(x,y): + try: + xa = x['abbr'] + ya = y['abbr'] + if xa[0] == '_': + if xa[1] == '_' and ya[0:2] == '__': + return xa > ya + elif ya[0:2] == '__': + return -1 + elif y[0] == '_': + return xa > ya + else: + return 1 + elif ya[0] == '_': + return -1 + else: + return xa > ya + except: + return 0 + cmpl = Completer() + cmpl.evalsource('\n'.join(vim.current.buffer),vim.eval("line('.')")) + all = cmpl.get_completions(context,match) + all.sort(complsort) + dictstr = '[' + # have to do this for double quoting + for cmpl in all: + dictstr += '{' + for x in cmpl: dictstr += '"%s":"%s",' % (x,cmpl[x]) + dictstr += '"icase":0},' + if dictstr[-1] == ',': dictstr = dictstr[:-1] + dictstr += ']' + #dbg("dict: %s" % dictstr) + vim.command("silent let g:pythoncomplete_completions = %s" % dictstr) + #dbg("Completion dict:\n%s" % all) + except vim.error: + dbg("VIM Error: %s" % vim.error) + +class Completer(object): + def __init__(self): + self.compldict = {} + self.parser = PyParser() + + def evalsource(self,text,line=0): + sc = self.parser.parse(text,line) + src = sc.get_code() + dbg("source: %s" % src) + try: exec(src) in self.compldict + except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1])) + for l in sc.locals: + try: exec(l) in self.compldict + except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l)) + + def _cleanstr(self,doc): + return doc.replace('"',' ').replace("'",' ') + + def get_arguments(self,func_obj): + def _ctor(obj): + try: return class_ob.__init__.im_func + except AttributeError: + for base in class_ob.__bases__: + rc = _find_constructor(base) + if rc is not None: return rc + return None + + arg_offset = 1 + if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj) + elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func + else: arg_offset = 0 + + arg_text='' + if type(func_obj) in [types.FunctionType, types.LambdaType]: + try: + cd = func_obj.func_code + real_args = cd.co_varnames[arg_offset:cd.co_argcount] + defaults = func_obj.func_defaults or '' + defaults = map(lambda name: "=%s" % name, defaults) + defaults = [""] * (len(real_args)-len(defaults)) + defaults + items = map(lambda a,d: a+d, real_args, defaults) + if func_obj.func_code.co_flags & 0x4: + items.append("...") + if func_obj.func_code.co_flags & 0x8: + items.append("***") + arg_text = (','.join(items)) + ')' + + except: + dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1])) + pass + if len(arg_text) == 0: + # The doc string sometimes contains the function signature + # this works for alot of C modules that are part of the + # standard library + doc = func_obj.__doc__ + if doc: + doc = doc.lstrip() + pos = doc.find('\n') + if pos > 0: + sigline = doc[:pos] + lidx = sigline.find('(') + ridx = sigline.find(')') + if lidx > 0 and ridx > 0: + arg_text = sigline[lidx+1:ridx] + ')' + if len(arg_text) == 0: arg_text = ')' + return arg_text + + def get_completions(self,context,match): + dbg("get_completions('%s','%s')" % (context,match)) + stmt = '' + if context: stmt += str(context) + if match: stmt += str(match) + try: + result = None + all = {} + ridx = stmt.rfind('.') + if len(stmt) > 0 and stmt[-1] == '(': + result = eval(_sanitize(stmt[:-1]), self.compldict) + doc = result.__doc__ + if doc is None: doc = '' + args = self.get_arguments(result) + return [{'word':self._cleanstr(args),'info':self._cleanstr(doc)}] + elif ridx == -1: + match = stmt + all = self.compldict + else: + match = stmt[ridx+1:] + stmt = _sanitize(stmt[:ridx]) + result = eval(stmt, self.compldict) + all = dir(result) + + dbg("completing: stmt:%s" % stmt) + completions = [] + + try: maindoc = result.__doc__ + except: maindoc = ' ' + if maindoc is None: maindoc = ' ' + for m in all: + if m == "_PyCmplNoType": continue #this is internal + try: + dbg('possible completion: %s' % m) + if m.find(match) == 0: + if result is None: inst = all[m] + else: inst = getattr(result,m) + try: doc = inst.__doc__ + except: doc = maindoc + typestr = str(inst) + if doc is None or doc == '': doc = maindoc + + wrd = m[len(match):] + c = {'word':wrd, 'abbr':m, 'info':self._cleanstr(doc)} + if "function" in typestr: + c['word'] += '(' + c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst)) + elif "method" in typestr: + c['word'] += '(' + c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst)) + elif "module" in typestr: + c['word'] += '.' + elif "class" in typestr: + c['word'] += '(' + c['abbr'] += '(' + completions.append(c) + except: + i = sys.exc_info() + dbg("inner completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt)) + return completions + except: + i = sys.exc_info() + dbg("completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt)) + return [] + +class Scope(object): + def __init__(self,name,indent,docstr=''): + self.subscopes = [] + self.docstr = docstr + self.locals = [] + self.parent = None + self.name = name + self.indent = indent + + def add(self,sub): + #print 'push scope: [%s@%s]' % (sub.name,sub.indent) + sub.parent = self + self.subscopes.append(sub) + return sub + + def doc(self,str): + """ Clean up a docstring """ + d = str.replace('\n',' ') + d = d.replace('\t',' ') + while d.find(' ') > -1: d = d.replace(' ',' ') + while d[0] in '"\'\t ': d = d[1:] + while d[-1] in '"\'\t ': d = d[:-1] + dbg("Scope(%s)::docstr = %s" % (self,d)) + self.docstr = d + + def local(self,loc): + self._checkexisting(loc) + self.locals.append(loc) + + def copy_decl(self,indent=0): + """ Copy a scope's declaration only, at the specified indent level - not local variables """ + return Scope(self.name,indent,self.docstr) + + def _checkexisting(self,test): + "Convienance function... keep out duplicates" + if test.find('=') > -1: + var = test.split('=')[0].strip() + for l in self.locals: + if l.find('=') > -1 and var == l.split('=')[0].strip(): + self.locals.remove(l) + + def get_code(self): + str = "" + if len(self.docstr) > 0: str += '"""'+self.docstr+'"""\n' + for l in self.locals: + if l.startswith('import'): str += l+'\n' + str += 'class _PyCmplNoType:\n def __getattr__(self,name):\n return None\n' + for sub in self.subscopes: + str += sub.get_code() + for l in self.locals: + if not l.startswith('import'): str += l+'\n' + + return str + + def pop(self,indent): + #print 'pop scope: [%s] to [%s]' % (self.indent,indent) + outer = self + while outer.parent != None and outer.indent >= indent: + outer = outer.parent + return outer + + def currentindent(self): + #print 'parse current indent: %s' % self.indent + return ' '*self.indent + + def childindent(self): + #print 'parse child indent: [%s]' % (self.indent+1) + return ' '*(self.indent+1) + +class Class(Scope): + def __init__(self, name, supers, indent, docstr=''): + Scope.__init__(self,name,indent, docstr) + self.supers = supers + def copy_decl(self,indent=0): + c = Class(self.name,self.supers,indent, self.docstr) + for s in self.subscopes: + c.add(s.copy_decl(indent+1)) + return c + def get_code(self): + str = '%sclass %s' % (self.currentindent(),self.name) + if len(self.supers) > 0: str += '(%s)' % ','.join(self.supers) + str += ':\n' + if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n' + if len(self.subscopes) > 0: + for s in self.subscopes: str += s.get_code() + else: + str += '%spass\n' % self.childindent() + return str + + +class Function(Scope): + def __init__(self, name, params, indent, docstr=''): + Scope.__init__(self,name,indent, docstr) + self.params = params + def copy_decl(self,indent=0): + return Function(self.name,self.params,indent, self.docstr) + def get_code(self): + str = "%sdef %s(%s):\n" % \ + (self.currentindent(),self.name,','.join(self.params)) + if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n' + str += "%spass\n" % self.childindent() + return str + +class PyParser: + def __init__(self): + self.top = Scope('global',0) + self.scope = self.top + + def _parsedotname(self,pre=None): + #returns (dottedname, nexttoken) + name = [] + if pre is None: + tokentype, token, indent = self.next() + if tokentype != NAME and token != '*': + return ('', token) + else: token = pre + name.append(token) + while True: + tokentype, token, indent = self.next() + if token != '.': break + tokentype, token, indent = self.next() + if tokentype != NAME: break + name.append(token) + return (".".join(name), token) + + def _parseimportlist(self): + imports = [] + while True: + name, token = self._parsedotname() + if not name: break + name2 = '' + if token == 'as': name2, token = self._parsedotname() + imports.append((name, name2)) + while token != "," and "\n" not in token: + tokentype, token, indent = self.next() + if token != ",": break + return imports + + def _parenparse(self): + name = '' + names = [] + level = 1 + while True: + tokentype, token, indent = self.next() + if token in (')', ',') and level == 1: + if '=' not in name: name = name.replace(' ', '') + names.append(name.strip()) + name = '' + if token == '(': + level += 1 + name += "(" + elif token == ')': + level -= 1 + if level == 0: break + else: name += ")" + elif token == ',' and level == 1: + pass + else: + name += "%s " % str(token) + return names + + def _parsefunction(self,indent): + self.scope=self.scope.pop(indent) + tokentype, fname, ind = self.next() + if tokentype != NAME: return None + + tokentype, open, ind = self.next() + if open != '(': return None + params=self._parenparse() + + tokentype, colon, ind = self.next() + if colon != ':': return None + + return Function(fname,params,indent) + + def _parseclass(self,indent): + self.scope=self.scope.pop(indent) + tokentype, cname, ind = self.next() + if tokentype != NAME: return None + + super = [] + tokentype, next, ind = self.next() + if next == '(': + super=self._parenparse() + elif next != ':': return None + + return Class(cname,super,indent) + + def _parseassignment(self): + assign='' + tokentype, token, indent = self.next() + if tokentype == tokenize.STRING or token == 'str': + return '""' + elif token == '(' or token == 'tuple': + return '()' + elif token == '[' or token == 'list': + return '[]' + elif token == '{' or token == 'dict': + return '{}' + elif tokentype == tokenize.NUMBER: + return '0' + elif token == 'open' or token == 'file': + return 'file' + elif token == 'None': + return '_PyCmplNoType()' + elif token == 'type': + return 'type(_PyCmplNoType)' #only for method resolution + else: + assign += token + level = 0 + while True: + tokentype, token, indent = self.next() + if token in ('(','{','['): + level += 1 + elif token in (']','}',')'): + level -= 1 + if level == 0: break + elif level == 0: + if token in (';','\n'): break + assign += token + return "%s" % assign + + def next(self): + type, token, (lineno, indent), end, self.parserline = self.gen.next() + if lineno == self.curline: + #print 'line found [%s] scope=%s' % (line.replace('\n',''),self.scope.name) + self.currentscope = self.scope + return (type, token, indent) + + def _adjustvisibility(self): + newscope = Scope('result',0) + scp = self.currentscope + while scp != None: + if type(scp) == Function: + slice = 0 + #Handle 'self' params + if scp.parent != None and type(scp.parent) == Class: + slice = 1 + newscope.local('%s = %s' % (scp.params[0],scp.parent.name)) + for p in scp.params[slice:]: + i = p.find('=') + if len(p) == 0: continue + pvar = '' + ptype = '' + if i == -1: + pvar = p + ptype = '_PyCmplNoType()' + else: + pvar = p[:i] + ptype = _sanitize(p[i+1:]) + if pvar.startswith('**'): + pvar = pvar[2:] + ptype = '{}' + elif pvar.startswith('*'): + pvar = pvar[1:] + ptype = '[]' + + newscope.local('%s = %s' % (pvar,ptype)) + + for s in scp.subscopes: + ns = s.copy_decl(0) + newscope.add(ns) + for l in scp.locals: newscope.local(l) + scp = scp.parent + + self.currentscope = newscope + return self.currentscope + + #p.parse(vim.current.buffer[:],vim.eval("line('.')")) + def parse(self,text,curline=0): + self.curline = int(curline) + buf = cStringIO.StringIO(''.join(text) + '\n') + self.gen = tokenize.generate_tokens(buf.readline) + self.currentscope = self.scope + + try: + freshscope=True + while True: + tokentype, token, indent = self.next() + #dbg( 'main: token=[%s] indent=[%s]' % (token,indent)) + + if tokentype == DEDENT or token == "pass": + self.scope = self.scope.pop(indent) + elif token == 'def': + func = self._parsefunction(indent) + if func is None: + print "function: syntax error..." + continue + dbg("new scope: function") + freshscope = True + self.scope = self.scope.add(func) + elif token == 'class': + cls = self._parseclass(indent) + if cls is None: + print "class: syntax error..." + continue + freshscope = True + dbg("new scope: class") + self.scope = self.scope.add(cls) + + elif token == 'import': + imports = self._parseimportlist() + for mod, alias in imports: + loc = "import %s" % mod + if len(alias) > 0: loc += " as %s" % alias + self.scope.local(loc) + freshscope = False + elif token == 'from': + mod, token = self._parsedotname() + if not mod or token != "import": + print "from: syntax error..." + continue + names = self._parseimportlist() + for name, alias in names: + loc = "from %s import %s" % (mod,name) + if len(alias) > 0: loc += " as %s" % alias + self.scope.local(loc) + freshscope = False + elif tokentype == STRING: + if freshscope: self.scope.doc(token) + elif tokentype == NAME: + name,token = self._parsedotname(token) + if token == '=': + stmt = self._parseassignment() + dbg("parseassignment: %s = %s" % (name, stmt)) + if stmt != None: + self.scope.local("%s = %s" % (name,stmt)) + freshscope = False + except StopIteration: #thrown on EOF + pass + except: + dbg("parse error: %s, %s @ %s" % + (sys.exc_info()[0], sys.exc_info()[1], self.parserline)) + return self._adjustvisibility() + +def _sanitize(str): + val = '' + level = 0 + for c in str: + if c in ('(','{','['): + level += 1 + elif c in (']','}',')'): + level -= 1 + elif level == 0: + val += c + return val + +sys.path.extend(['.','..']) +PYTHONEOF +endfunction + +call s:DefPython() +" vim: set et ts=4: diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt new file mode 100644 index 00000000..174229d9 --- /dev/null +++ b/doc/NERD_tree.txt @@ -0,0 +1,1291 @@ +*NERD_tree.txt* A tree explorer plugin that owns your momma! + + + + omg its ... ~ + + ________ ________ _ ____________ ____ __________ ____________~ + /_ __/ / / / ____/ / | / / ____/ __ \/ __ \ /_ __/ __ \/ ____/ ____/~ + / / / /_/ / __/ / |/ / __/ / /_/ / / / / / / / /_/ / __/ / __/ ~ + / / / __ / /___ / /| / /___/ _, _/ /_/ / / / / _, _/ /___/ /___ ~ + /_/ /_/ /_/_____/ /_/ |_/_____/_/ |_/_____/ /_/ /_/ |_/_____/_____/ ~ + + + Reference Manual~ + + + + +============================================================================== +CONTENTS *NERDTree-contents* + + 1.Intro...................................|NERDTree| + 2.Functionality provided..................|NERDTreeFunctionality| + 2.1.Global commands...................|NERDTreeGlobalCommands| + 2.2.Bookmarks.........................|NERDTreeBookmarks| + 2.2.1.The bookmark table..........|NERDTreeBookmarkTable| + 2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands| + 2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks| + 2.3.NERD tree mappings................|NERDTreeMappings| + 2.4.The NERD tree menu................|NERDTreeMenu| + 3.Options.................................|NERDTreeOptions| + 3.1.Option summary....................|NERDTreeOptionSummary| + 3.2.Option details....................|NERDTreeOptionDetails| + 4.The NERD tree API.......................|NERDTreeAPI| + 4.1.Key map API.......................|NERDTreeKeymapAPI| + 4.2.Menu API..........................|NERDTreeMenuAPI| + 5.About...................................|NERDTreeAbout| + 6.Changelog...............................|NERDTreeChangelog| + 7.Credits.................................|NERDTreeCredits| + 8.License.................................|NERDTreeLicense| + +============================================================================== +1. Intro *NERDTree* + +What is this "NERD tree"?? + +The NERD tree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERD tree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERD tree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * The position and size of the NERD tree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERD tree window will appear exactly + as you left it + * You can have a separate NERD tree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netw), so if + you :edit a directory a (slighly modified) NERD tree will appear in the + current window + * A programmable menu system is provided (simulates right clicking on a + node) + * one default menu plugin is provided to perform basic filesytem + operations (create/delete/move/copy files/directories) + * There's an API for adding your own keymappings + + +============================================================================== +2. Functionality provided *NERDTreeFunctionality* + +------------------------------------------------------------------------------ +2.1. Global Commands *NERDTreeGlobalCommands* + +:NERDTree [ | ] *:NERDTree* + Opens a fresh NERD tree. The root of the tree depends on the argument + given. There are 3 cases: If no argument is given, the current directory + will be used. If a directory is given, that will be used. If a bookmark + name is given, the corresponding directory will be used. For example: > + :NERDTree /home/marty/vim7/src + :NERDTree foo (foo is the name of a bookmark) +< +:NERDTreeFromBookmark *:NERDTreeFromBookmark* + Opens a fresh NERD tree with the root initialized to the dir for + . This only reason to use this command over :NERDTree is for + the completion (which is for bookmarks rather than directories). + +:NERDTreeToggle [ | ] *:NERDTreeToggle* + If a NERD tree already exists for this tab, it is reopened and rendered + again. If no NERD tree exists for this tab then this command acts the + same as the |:NERDTree| command. + +:NERDTreeMirror *:NERDTreeMirror* + Shares an existing NERD tree, from another tab, in the current tab. + Changes made to one tree are reflected in both as they are actually the + same buffer. + + If only one other NERD tree exists, that tree is automatically mirrored. If + more than one exists, the script will ask which tree to mirror. + +:NERDTreeClose *:NERDTreeClose* + Close the NERD tree in this tab. + +:NERDTreeFind *:NERDTreeFind* + Find the current file in the tree. + + If not tree exists and the current file is under vim's CWD, then init a + tree at the CWD and reveal the file. Otherwise init a tree in the current + file's directory. + + In any case, the current file is revealed and the cursor is placed on it. + +------------------------------------------------------------------------------ +2.2. Bookmarks *NERDTreeBookmarks* + +Bookmarks in the NERD tree are a way to tag files or directories of interest. +For example, you could use bookmarks to tag all of your project directories. + +------------------------------------------------------------------------------ +2.2.1. The Bookmark Table *NERDTreeBookmarkTable* + +If the bookmark table is active (see |NERDTree-B| and +|'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double +click bookmarks or use the |NERDTree-o| mapping to activate them. See also, +|NERDTree-t| and |NERDTree-T| + +------------------------------------------------------------------------------ +2.2.2. Bookmark commands *NERDTreeBookmarkCommands* + +Note that the following commands are only available in the NERD tree buffer. + +:Bookmark + Bookmark the current node as . If there is already a + bookmark, it is overwritten. must not contain spaces. + If is not provided, it defaults to the file or directory name. + For directories, a trailing slash is present. + +:BookmarkToRoot + Make the directory corresponding to the new root. If a treenode + corresponding to is already cached somewhere in the tree then + the current tree will be used, otherwise a fresh tree will be opened. + Note that if points to a file then its parent will be used + instead. + +:RevealBookmark + If the node is cached under the current root then it will be revealed + (i.e. directory nodes above it will be opened) and the cursor will be + placed on it. + +:OpenBookmark + must point to a file. The file is opened as though |NERDTree-o| + was applied. If the node is cached under the current root then it will be + revealed and the cursor will be placed on it. + +:ClearBookmarks [] + Remove all the given bookmarks. If no bookmarks are given then remove all + bookmarks on the current node. + +:ClearAllBookmarks + Remove all bookmarks. + +:ReadBookmarks + Re-read the bookmarks in the |'NERDTreeBookmarksFile'|. + +See also |:NERDTree| and |:NERDTreeFromBookmark|. + +------------------------------------------------------------------------------ +2.2.3. Invalid Bookmarks *NERDTreeInvalidBookmarks* + +If invalid bookmarks are detected, the script will issue an error message and +the invalid bookmarks will become unavailable for use. + +These bookmarks will still be stored in the bookmarks file (see +|'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line +after the valid bookmarks but before the invalid ones. + +Each line in the bookmarks file represents one bookmark. The proper format is: + + +After you have corrected any invalid bookmarks, either restart vim, or go +:ReadBookmarks from the NERD tree window. + +------------------------------------------------------------------------------ +2.3. NERD tree Mappings *NERDTreeMappings* + +Default Description~ help-tag~ +Key~ + +o.......Open files, directories and bookmarks....................|NERDTree-o| +go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go| +t.......Open selected node/bookmark in a new tab.................|NERDTree-t| +T.......Same as 't' but keep the focus on the current tab........|NERDTree-T| +i.......Open selected file in a split window.....................|NERDTree-i| +gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi| +s.......Open selected file in a new vsplit.......................|NERDTree-s| +gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs| +O.......Recursively open the selected directory..................|NERDTree-O| +x.......Close the current nodes parent...........................|NERDTree-x| +X.......Recursively close all children of the current node.......|NERDTree-X| +e.......Edit the current dif.....................................|NERDTree-e| + +...............same as |NERDTree-o|. +double-click.......same as the |NERDTree-o| map. +middle-click.......same as |NERDTree-i| for files, same as + |NERDTree-e| for dirs. + +D.......Delete the current bookmark .............................|NERDTree-D| + +P.......Jump to the root node....................................|NERDTree-P| +p.......Jump to current nodes parent.............................|NERDTree-p| +K.......Jump up inside directories at the current tree depth.....|NERDTree-K| +J.......Jump down inside directories at the current tree depth...|NERDTree-J| +...Jump down to the next sibling of the current directory...|NERDTree-C-J| +...Jump up to the previous sibling of the current directory.|NERDTree-C-K| + +C.......Change the tree root to the selected dir.................|NERDTree-C| +u.......Move the tree root up one directory......................|NERDTree-u| +U.......Same as 'u' except the old root node is left open........|NERDTree-U| +r.......Recursively refresh the current directory................|NERDTree-r| +R.......Recursively refresh the current root.....................|NERDTree-R| +m.......Display the NERD tree menu...............................|NERDTree-m| +cd......Change the CWD to the dir of the selected node...........|NERDTree-cd| + +I.......Toggle whether hidden files displayed....................|NERDTree-I| +f.......Toggle whether the file filters are used.................|NERDTree-f| +F.......Toggle whether files are displayed.......................|NERDTree-F| +B.......Toggle whether the bookmark table is displayed...........|NERDTree-B| + +q.......Close the NERDTree window................................|NERDTree-q| +A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A| +?.......Toggle the display of the quick help.....................|NERDTree-?| + +------------------------------------------------------------------------------ + *NERDTree-o* +Default key: o +Map option: NERDTreeMapActivateNode +Applies to: files and directories. + +If a file node is selected, it is opened in the previous window. + +If a directory is selected it is opened or closed depending on its current +state. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +If a bookmark that links to a file is selected then that file is opened in the +previous window. + +------------------------------------------------------------------------------ + *NERDTree-go* +Default key: go +Map option: None +Applies to: files. + +If a file node is selected, it is opened in the previous window, but the +cursor does not move. + +The key combo for this mapping is always "g" + NERDTreeMapActivateNode (see +|NERDTree-o|). + +------------------------------------------------------------------------------ + *NERDTree-t* +Default key: t +Map option: NERDTreeMapOpenInTab +Applies to: files and directories. + +Opens the selected file in a new tab. If a directory is selected, a fresh +NERD Tree for that directory is opened in a new tab. + +If a bookmark which points to a directory is selected, open a NERD tree for +that directory in a new tab. If the bookmark points to a file, open that file +in a new tab. + +------------------------------------------------------------------------------ + *NERDTree-T* +Default key: T +Map option: NERDTreeMapOpenInTabSilent +Applies to: files and directories. + +The same as |NERDTree-t| except that the focus is kept in the current tab. + +------------------------------------------------------------------------------ + *NERDTree-i* +Default key: i +Map option: NERDTreeMapOpenSplit +Applies to: files. + +Opens the selected file in a new split window and puts the cursor in the new +window. + +------------------------------------------------------------------------------ + *NERDTree-gi* +Default key: gi +Map option: None +Applies to: files. + +The same as |NERDTree-i| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenSplit (see +|NERDTree-i|). + +------------------------------------------------------------------------------ + *NERDTree-s* +Default key: s +Map option: NERDTreeMapOpenVSplit +Applies to: files. + +Opens the selected file in a new vertically split window and puts the cursor in +the new window. + +------------------------------------------------------------------------------ + *NERDTree-gs* +Default key: gs +Map option: None +Applies to: files. + +The same as |NERDTree-s| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenVSplit (see +|NERDTree-s|). + +------------------------------------------------------------------------------ + *NERDTree-O* +Default key: O +Map option: NERDTreeMapOpenRecursively +Applies to: directories. + +Recursively opens the selelected directory. + +All files and directories are cached, but if a directory would not be +displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the +hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not +cached. This is handy, especially if you have .svn directories. + +------------------------------------------------------------------------------ + *NERDTree-x* +Default key: x +Map option: NERDTreeMapCloseDir +Applies to: files and directories. + +Closes the parent of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-X* +Default key: X +Map option: NERDTreeMapCloseChildren +Applies to: directories. + +Recursively closes all children of the selected directory. + +Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping. + +------------------------------------------------------------------------------ + *NERDTree-e* +Default key: e +Map option: NERDTreeMapOpenExpl +Applies to: files and directories. + +|:edit|s the selected directory, or the selected file's directory. This could +result in a NERD tree or a netrw being opened, depending on +|'NERDTreeHijackNetrw'|. + +------------------------------------------------------------------------------ + *NERDTree-D* +Default key: D +Map option: NERDTreeMapDeleteBookmark +Applies to: lines in the bookmarks table + +Deletes the currently selected bookmark. + +------------------------------------------------------------------------------ + *NERDTree-P* +Default key: P +Map option: NERDTreeMapJumpRoot +Applies to: no restrictions. + +Jump to the tree root. + +------------------------------------------------------------------------------ + *NERDTree-p* +Default key: p +Map option: NERDTreeMapJumpParent +Applies to: files and directories. + +Jump to the parent node of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-K* +Default key: K +Map option: NERDTreeMapJumpFirstChild +Applies to: files and directories. + +Jump to the first child of the current nodes parent. + +If the cursor is already on the first node then do the following: + * loop back thru the siblings of the current nodes parent until we find an + open dir with children + * go to the first child of that node + +------------------------------------------------------------------------------ + *NERDTree-J* +Default key: J +Map option: NERDTreeMapJumpLastChild +Applies to: files and directories. + +Jump to the last child of the current nodes parent. + +If the cursor is already on the last node then do the following: + * loop forward thru the siblings of the current nodes parent until we find + an open dir with children + * go to the last child of that node + +------------------------------------------------------------------------------ + *NERDTree-C-J* +Default key: +Map option: NERDTreeMapJumpNextSibling +Applies to: files and directories. + +Jump to the next sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C-K* +Default key: +Map option: NERDTreeMapJumpPrevSibling +Applies to: files and directories. + +Jump to the previous sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C* +Default key: C +Map option: NERDTreeMapChdir +Applies to: directories. + +Make the selected directory node the new tree root. If a file is selected, its +parent is used. + +------------------------------------------------------------------------------ + *NERDTree-u* +Default key: u +Map option: NERDTreeMapUpdir +Applies to: no restrictions. + +Move the tree root up a dir (like doing a "cd .."). + +------------------------------------------------------------------------------ + *NERDTree-U* +Default key: U +Map option: NERDTreeMapUpdirKeepOpen +Applies to: no restrictions. + +Like |NERDTree-u| except that the old tree root is kept open. + +------------------------------------------------------------------------------ + *NERDTree-r* +Default key: r +Map option: NERDTreeMapRefresh +Applies to: files and directories. + +If a dir is selected, recursively refresh that dir, i.e. scan the filesystem +for changes and represent them in the tree. + +If a file node is selected then the above is done on it's parent. + +------------------------------------------------------------------------------ + *NERDTree-R* +Default key: R +Map option: NERDTreeMapRefreshRoot +Applies to: no restrictions. + +Recursively refresh the tree root. + +------------------------------------------------------------------------------ + *NERDTree-m* +Default key: m +Map option: NERDTreeMapMenu +Applies to: files and directories. + +Display the NERD tree menu. See |NERDTreeMenu| for details. + +------------------------------------------------------------------------------ + *NERDTree-cd* +Default key: cd +Map option: NERDTreeMapChdir +Applies to: files and directories. + +Change vims current working directory to that of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-I* +Default key: I +Map option: NERDTreeMapToggleHidden +Applies to: no restrictions. + +Toggles whether hidden files (i.e. "dot files") are displayed. + +------------------------------------------------------------------------------ + *NERDTree-f* +Default key: f +Map option: NERDTreeMapToggleFilters +Applies to: no restrictions. + +Toggles whether file filters are used. See |'NERDTreeIgnore'| for details. + +------------------------------------------------------------------------------ + *NERDTree-F* +Default key: F +Map option: NERDTreeMapToggleFiles +Applies to: no restrictions. + +Toggles whether file nodes are displayed. + +------------------------------------------------------------------------------ + *NERDTree-B* +Default key: B +Map option: NERDTreeMapToggleBookmarks +Applies to: no restrictions. + +Toggles whether the bookmarks table is displayed. + +------------------------------------------------------------------------------ + *NERDTree-q* +Default key: q +Map option: NERDTreeMapQuit +Applies to: no restrictions. + +Closes the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-A* +Default key: A +Map option: NERDTreeMapToggleZoom +Applies to: no restrictions. + +Maximize (zoom) and minimize the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-?* +Default key: ? +Map option: NERDTreeMapHelp +Applies to: no restrictions. + +Toggles whether the quickhelp is displayed. + +------------------------------------------------------------------------------ +2.3. The NERD tree menu *NERDTreeMenu* + +The NERD tree has a menu that can be programmed via the an API (see +|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most +file explorers have. + +The script comes with two default menu plugins: exec_menuitem.vim and +fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for +creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a +menu item to execute executable files. + +Related tags: |NERDTree-m| |NERDTreeApi| + +============================================================================== +3. Customisation *NERDTreeOptions* + + +------------------------------------------------------------------------------ +3.1. Customisation summary *NERDTreeOptionSummary* + +The script provides the following options that can customise the behaviour the +NERD tree. These options should be set in your vimrc. + +|'loaded_nerd_tree'| Turns off the script. + +|'NERDChristmasTree'| Tells the NERD tree to make itself colourful + and pretty. + +|'NERDTreeAutoCenter'| Controls whether the NERD tree window centers + when the cursor moves within a specified + distance to the top/bottom of the window. +|'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering. + +|'NERDTreeCaseSensitiveSort'| Tells the NERD tree whether to be case + sensitive or not when sorting nodes. + +|'NERDTreeChDirMode'| Tells the NERD tree if/when it should change + vim's current working directory. + +|'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the + current cursor line. + +|'NERDTreeHijackNetrw'| Tell the NERD tree whether to replace the netrw + autocommands for exploring local directories. + +|'NERDTreeIgnore'| Tells the NERD tree which files to ignore. + +|'NERDTreeBookmarksFile'| Where the bookmarks are stored. + +|'NERDTreeMouseMode'| Tells the NERD tree how to handle mouse + clicks. + +|'NERDTreeQuitOnOpen'| Closes the tree window after opening a file. + +|'NERDTreeShowBookmarks'| Tells the NERD tree whether to display the + bookmarks table on startup. + +|'NERDTreeShowFiles'| Tells the NERD tree whether to display files + in the tree on startup. + +|'NERDTreeShowHidden'| Tells the NERD tree whether to display hidden + files on startup. + +|'NERDTreeShowLineNumbers'| Tells the NERD tree whether to display line + numbers in the tree window. + +|'NERDTreeSortOrder'| Tell the NERD tree how to sort the nodes in + the tree. + +|'NERDTreeStatusline'| Set a statusline for NERD tree windows. + +|'NERDTreeWinPos'| Tells the script where to put the NERD tree + window. + +|'NERDTreeWinSize'| Sets the window size when the NERD tree is + opened. + +|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and + 'Press ? for help' text. + +|'NERDTreeDirArrows'| Tells the NERD tree to use arrows instead of + + ~ chars when displaying directories. + +------------------------------------------------------------------------------ +3.2. Customisation details *NERDTreeOptionDetails* + +To enable any of the below options you should put the given line in your +~/.vimrc + + *'loaded_nerd_tree'* +If this plugin is making you feel homicidal, it may be a good idea to turn it +off with this line in your vimrc: > + let loaded_nerd_tree=1 +< +------------------------------------------------------------------------------ + *'NERDChristmasTree'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then some extra syntax highlighting elements are +added to the nerd tree to make it more colourful. + +Set it to 0 for a more vanilla looking tree. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenter'* +Values: 0 or 1. +Default: 1 + +If set to 1, the NERD tree window will center around the cursor if it moves to +within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window. + +This is ONLY done in response to tree navigation mappings, +i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p| +|NERDTree-P| + +The centering is done with a |zz| operation. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenterThreshold'* +Values: Any natural number. +Default: 3 + +This option controls the "sensitivity" of the NERD tree auto centering. See +|'NERDTreeAutoCenter'| for details. + +------------------------------------------------------------------------------ + *'NERDTreeCaseSensitiveSort'* +Values: 0 or 1. +Default: 0. + +By default the NERD tree does not sort nodes case sensitively, i.e. nodes +could appear like this: > + bar.c + Baz.c + blarg.c + boner.c + Foo.c +< +But, if you set this option to 1 then the case of the nodes will be taken into +account. The above nodes would then be sorted like this: > + Baz.c + Foo.c + bar.c + blarg.c + boner.c +< +------------------------------------------------------------------------------ + *'NERDTreeChDirMode'* + +Values: 0, 1 or 2. +Default: 0. + +Use this option to tell the script when (if at all) to change the current +working directory (CWD) for vim. + +If it is set to 0 then the CWD is never changed by the NERD tree. + +If set to 1 then the CWD is changed when the NERD tree is first loaded to the +directory it is initialized in. For example, if you start the NERD tree with > + :NERDTree /home/marty/foobar +< +then the CWD will be changed to /home/marty/foobar and will not be changed +again unless you init another NERD tree with a similar command. + +If the option is set to 2 then it behaves the same as if set to 1 except that +the CWD is changed whenever the tree root is changed. For example, if the CWD +is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new +root then the CWD will become /home/marty/foobar/baz. + +------------------------------------------------------------------------------ + *'NERDTreeHighlightCursorline'* +Values: 0 or 1. +Default: 1. + +If set to 1, the current cursor line in the NERD tree buffer will be +highlighted. This is done using the |'cursorline'| option. + +------------------------------------------------------------------------------ + *'NERDTreeHijackNetrw'* +Values: 0 or 1. +Default: 1. + +If set to 1, doing a > + :edit +< +will open up a "secondary" NERD tree instead of a netrw in the target window. + +Secondary NERD trees behaves slighly different from a regular trees in the +following respects: + 1. 'o' will open the selected file in the same window as the tree, + replacing it. + 2. you can have as many secondary tree as you want in the same tab. + +------------------------------------------------------------------------------ + *'NERDTreeIgnore'* +Values: a list of regular expressions. +Default: ['\~$']. + +This option is used to specify which files the NERD tree should ignore. It +must be a list of regular expressions. When the NERD tree is rendered, any +files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be +displayed. + +For example if you put the following line in your vimrc: > + let NERDTreeIgnore=['\.vim$', '\~$'] +< +then all files ending in .vim or ~ will be ignored. + +Note: to tell the NERD tree not to ignore any files you must use the following +line: > + let NERDTreeIgnore=[] +< + +The file filters can be turned on and off dynamically with the |NERDTree-f| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksFile'* +Values: a path +Default: $HOME/.NERDTreeBookmarks + +This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. + +------------------------------------------------------------------------------ + *'NERDTreeMouseMode'* +Values: 1, 2 or 3. +Default: 1. + +If set to 1 then a double click on a node is required to open it. +If set to 2 then a single click will open directory nodes, while a double +click will still be required for file nodes. +If set to 3 then a single click will open any node. + +Note: a double click anywhere on a line that a tree node is on will +activate it, but all single-click activations must be done on name of the node +itself. For example, if you have the following node: > + | | |-application.rb +< +then (to single click activate it) you must click somewhere in +'application.rb'. + +------------------------------------------------------------------------------ + *'NERDTreeQuitOnOpen'* + +Values: 0 or 1. +Default: 0 + +If set to 1, the NERD tree window will close after opening a file with the +|NERDTree-o|, |NERDTree-i|, |NERDTree-t| and |NERDTree-T| mappings. + +------------------------------------------------------------------------------ + *'NERDTreeShowBookmarks'* +Values: 0 or 1. +Default: 0. + +If this option is set to 1 then the bookmarks table will be displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-B| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeShowFiles'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then files are displayed in the NERD tree. If it is +set to 0 then only directories are displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-F| +mapping and is useful for drastically shrinking the tree when you are +navigating to a different part of the tree. + +------------------------------------------------------------------------------ + *'NERDTreeShowHidden'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display hidden files by default. This option +can be dynamically toggled, per tree, with the |NERDTree-I| mapping. Use one +of the follow lines to set this option: > + let NERDTreeShowHidden=0 + let NERDTreeShowHidden=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeShowLineNumbers'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display line numbers for the NERD tree +window. Use one of the follow lines to set this option: > + let NERDTreeShowLineNumbers=0 + let NERDTreeShowLineNumbers=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeSortOrder'* +Values: a list of regular expressions. +Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] + +This option is set to a list of regular expressions which are used to +specify the order of nodes under their parent. + +For example, if the option is set to: > + ['\.vim$', '\.c$', '\.h$', '*', 'foobar'] +< +then all .vim files will be placed at the top, followed by all .c files then +all .h files. All files containing the string 'foobar' will be placed at the +end. The star is a special flag: it tells the script that every node that +doesnt match any of the other regexps should be placed here. + +If no star is present in 'NERDTreeSortOrder' then one is automatically +appended to the array. + +The regex '\/$' should be used to match directory nodes. + +After this sorting is done, the files in each group are sorted alphabetically. + +Other examples: > + (1) ['*', '\/$'] + (2) [] + (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$', '\.bak$', '\~$'] +< +1. Directories will appear last, everything else will appear above. +2. Everything will simply appear in alphabetical order. +3. Dirs will appear first, then ruby and php. Swap files, bak files and vim + backup files will appear last with everything else preceding them. + +------------------------------------------------------------------------------ + *'NERDTreeStatusline'* +Values: Any valid statusline setting. +Default: %{b:NERDTreeRoot.path.strForOS(0)} + +Tells the script what to use as the |'statusline'| setting for NERD tree +windows. + +Note that the statusline is set using |:let-&| not |:set| so escaping spaces +isn't necessary. + +Setting this option to -1 will will deactivate it so that your global +statusline setting is used instead. + +------------------------------------------------------------------------------ + *'NERDTreeWinPos'* +Values: "left" or "right" +Default: "left". + +This option is used to determine where NERD tree window is placed on the +screen. + +This option makes it possible to use two different explorer plugins +simultaneously. For example, you could have the taglist plugin on the left of +the window and the NERD tree on the right. + +------------------------------------------------------------------------------ + *'NERDTreeWinSize'* +Values: a positive integer. +Default: 31. + +This option is used to change the size of the NERD tree when it is loaded. + +------------------------------------------------------------------------------ + *'NERDTreeMinimalUI'* +Values: 0 or 1 +Default: 0 + +This options disables the 'Bookmarks' label 'Press ? for help' text. Use one +of the following lines to set this option: > + let NERDTreeMinimalUI=0 + let NERDTreeMinimalUI=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeDirArrows'* +Values: 0 or 1 +Default: 0. + +This option is used to change the default look of directory nodes displayed in +the tree. When set to 0 it shows old-school bars (|), + and ~ chars. If set to +1 it shows right and down arrows. Use one of the follow lines to set this +option: > + let NERDTreeDirArrows=0 + let NERDTreeDirArrows=1 +< + +============================================================================== +4. The NERD tree API *NERDTreeAPI* + +The NERD tree script allows you to add custom key mappings and menu items via +a set of API calls. Any scripts that use this API should be placed in +~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows). + +The script exposes some prototype objects that can be used to manipulate the +tree and/or get information from it: > + g:NERDTreePath + g:NERDTreeDirNode + g:NERDTreeFileNode + g:NERDTreeBookmark +< +See the code/comments in NERD_tree.vim to find how to use these objects. The +following code conventions are used: + * class members start with a capital letter + * instance members start with a lower case letter + * private members start with an underscore + +See this blog post for more details: + http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html + +------------------------------------------------------------------------------ +4.1. Key map API *NERDTreeKeymapAPI* + +NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()* + Adds a new keymapping for all NERD tree buffers. + {options} must be a dictionary, and must contain the following keys: + "key" - the trigger key for the new mapping + "callback" - the function the new mapping will be bound to + "quickhelpText" - the text that will appear in the quickhelp (see + |NERDTree-?|) + + Example: > + call NERDTreeAddKeyMap({ + \ 'key': 'b', + \ 'callback': 'NERDTreeEchoCurrentNode', + \ 'quickhelpText': 'echo full path of current node' }) + + function! NERDTreeEchoCurrentNode() + let n = g:NERDTreeFileNode.GetSelected() + if n != {} + echomsg 'Current node: ' . n.path.str() + endif + endfunction +< + This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim. + It adds a (rather useless) mapping on 'b' which echos the full path to the + current node. + +------------------------------------------------------------------------------ +4.2. Menu API *NERDTreeMenuAPI* + +NERDTreeAddSubmenu({options}) *NERDTreeAddSubmenu()* + Creates and returns a new submenu. + + {options} must be a dictionary and must contain the following keys: + "text" - the text of the submenu that the user will see + "shortcut" - a shortcut key for the submenu (need not be unique) + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this submenu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - the parent submenu of the new submenu (returned from a previous + invocation of NERDTreeAddSubmenu()). If this key is left out then the new + submenu will sit under the top level menu. + + See below for an example. + +NERDTreeAddMenuItem({options}) *NERDTreeAddMenuItem()* + Adds a new menu item to the NERD tree menu (see |NERDTreeMenu|). + + {options} must be a dictionary and must contain the + following keys: + "text" - the text of the menu item which the user will see + "shortcut" - a shortcut key for the menu item (need not be unique) + "callback" - the function that will be called when the user activates the + menu item. + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this menu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - if the menu item belongs under a submenu then this key must be + specified. This value for this key will be the object that + was returned when the submenu was created with |NERDTreeAddSubmenu()|. + + See below for an example. + +NERDTreeAddMenuSeparator([{options}]) *NERDTreeAddMenuSeparator()* + Adds a menu separator (a row of dashes). + + {options} is an optional dictionary that may contain the following keys: + "isActiveCallback" - see description in |NERDTreeAddMenuItem()|. + +Below is an example of the menu API in action. > + call NERDTreeAddMenuSeparator() + + call NERDTreeAddMenuItem({ + \ 'text': 'a (t)op level menu item', + \ 'shortcut': 't', + \ 'callback': 'SomeFunction' }) + + let submenu = NERDTreeAddSubmenu({ + \ 'text': 'a (s)ub menu', + \ 'shortcut': 's' }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 1', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 2', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) +< +This will create the following menu: > + -------------------- + a (t)op level menu item + a (s)ub menu +< +Where selecting "a (s)ub menu" will lead to a second menu: > + (n)ested item 1 + (n)ested item 2 +< +When any of the 3 concrete menu items are selected the function "SomeFunction" +will be called. + +------------------------------------------------------------------------------ +NERDTreeRender() *NERDTreeRender()* + Re-renders the NERD tree buffer. Useful if you change the state of the + tree and you want to it to be reflected in the UI. + +============================================================================== +5. About *NERDTreeAbout* + +The author of the NERD tree is a terrible terrible monster called Martyzilla +who gobbles up small children with milk and sugar for breakfast. + +He can be reached at martin.grenfell at gmail dot com. He would love to hear +from you, so feel free to send him suggestions and/or comments about this +plugin. Don't be shy --- the worst he can do is slaughter you and stuff you in +the fridge for later ;) + +The latest stable versions can be found at + http://www.vim.org/scripts/script.php?script_id=1658 + +The latest dev versions are on github + http://github.com/scrooloose/nerdtree + + +============================================================================== +6. Changelog *NERDTreeChangelog* + +4.2.0 + - Add NERDTreeDirArrows option to make the UI use pretty arrow chars + instead of the old +~| chars to define the tree structure (sickill) + - shift the syntax highlighting out into its own syntax file (gnap) + - add some mac specific options to the filesystem menu - for macvim + only (andersonfreitas) + - Add NERDTreeMinimalUI option to remove some non functional parts of the + nerdtree ui (camthompson) + - tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the + new behaviour (benjamingeiger) + - if no name is given to :Bookmark, make it default to the name of the + target file/dir (minyoung) + - use 'file' completion when doing copying, create, and move + operations (EvanDotPro) + - lots of misc bug fixes (paddyoloughlin, sdewald, camthompson, Vitaly + Bogdanov, AndrewRadev, mathias, scottstvnsn, kml, wycats, me RAWR!) + +4.1.0 + features: + - NERDTreeFind to reveal the node for the current buffer in the tree, + see |NERDTreeFind|. This effectively merges the FindInNERDTree plugin (by + Doug McInnes) into the script. + - make NERDTreeQuitOnOpen apply to the t/T keymaps too. Thanks to Stefan + Ritter and Rémi Prévost. + - truncate the root node if wider than the tree window. Thanks to Victor + Gonzalez. + + bugfixes: + - really fix window state restoring + - fix some win32 path escaping issues. Thanks to Stephan Baumeister, Ricky, + jfilip1024, and Chris Chambers + +4.0.0 + - add a new programmable menu system (see :help NERDTreeMenu). + - add new APIs to add menus/menu-items to the menu system as well as + custom key mappings to the NERD tree buffer (see :help NERDTreeAPI). + - removed the old API functions + - added a mapping to maximize/restore the size of nerd tree window, thanks + to Guillaume Duranceau for the patch. See :help NERDTree-A for details. + + - fix a bug where secondary nerd trees (netrw hijacked trees) and + NERDTreeQuitOnOpen didnt play nicely, thanks to Curtis Harvey. + - fix a bug where the script ignored directories whose name ended in a dot, + thanks to Aggelos Orfanakos for the patch. + - fix a bug when using the x mapping on the tree root, thanks to Bryan + Venteicher for the patch. + - fix a bug where the cursor position/window size of the nerd tree buffer + wasnt being stored on closing the window, thanks to Richard Hart. + - fix a bug where NERDTreeMirror would mirror the wrong tree + +3.1.1 + - fix a bug where a non-listed no-name buffer was getting created every + time the tree windows was created, thanks to Derek Wyatt and owen1 + - make behave the same as the 'o' mapping + - some helptag fixes in the doc, thanks strull + - fix a bug when using :set nohidden and opening a file where the previous + buf was modified. Thanks iElectric + - other minor fixes + +3.1.0 + New features: + - add mappings to open files in a vsplit, see :help NERDTree-s and :help + NERDTree-gs + - make the statusline for the nerd tree window default to something + hopefully more useful. See :help 'NERDTreeStatusline' + Bugfixes: + - make the hijack netrw functionality work when vim is started with "vim + " (thanks to Alf Mikula for the patch). + - fix a bug where the CWD wasnt being changed for some operations even when + NERDTreeChDirMode==2 (thanks to Lucas S. Buchala) + - add -bar to all the nerd tree :commands so they can chain with other + :commands (thanks to tpope) + - fix bugs when ignorecase was set (thanks to nach) + - fix a bug with the relative path code (thanks to nach) + - fix a bug where doing a :cd would cause :NERDTreeToggle to fail (thanks nach) + + +3.0.1 + Bugfixes: + - fix bugs with :NERDTreeToggle and :NERDTreeMirror when 'hidden + was not set + - fix a bug where :NERDTree would fail if was relative and + didnt start with a ./ or ../ Thanks to James Kanze. + - make the q mapping work with secondary (:e style) trees, + thanks to jamessan + - fix a bunch of small bugs with secondary trees + + More insane refactoring. + +3.0.0 + - hijack netrw so that doing an :edit will put a NERD tree in + the window rather than a netrw browser. See :help 'NERDTreeHijackNetrw' + - allow sharing of trees across tabs, see :help :NERDTreeMirror + - remove "top" and "bottom" as valid settings for NERDTreeWinPos + - change the '' mapping to 'i' + - change the 'H' mapping to 'I' + - lots of refactoring + +============================================================================== +7. Credits *NERDTreeCredits* + +Thanks to the following people for testing, bug reports, ideas etc. Without +you I probably would have got bored of the hacking the NERD tree and +just downloaded pr0n instead. + + Tim Carey-Smith (halorgium) + Vigil + Nick Brettell + Thomas Scott Urban + Terrance Cohen + Yegappan Lakshmanan + Jason Mills + Michael Geddes (frogonwheels) + Yu Jun + Michael Madsen + AOYAMA Shotaro + Zhang Weiwu + Niels Aan de Brugh + Olivier Yiptong + Zhang Shuhan + Cory Echols + Piotr Czachur + Yuan Jiang + Matan Nassau + Maxim Kim + Charlton Wang + Matt Wozniski (godlygeek) + knekk + Sean Chou + Ryan Penn + Simon Peter Nicholls + Michael Foobar + Tomasz Chomiuk + Denis Pokataev + Tim Pope (tpope) + James Kanze + James Vega (jamessan) + Frederic Chanal (nach) + Alf Mikula + Lucas S. Buchala + Curtis Harvey + Guillaume Duranceau + Richard Hart (hates) + Doug McInnes + Stefan Ritter + Rémi Prévost + Victor Gonzalez + Stephan Baumeister + Ricky + jfilip1024 + Chris Chambers + Vitaly Bogdanov + Patrick O'Loughlin (paddyoloughlin) + Cam Thompson (camthompson) + Marcin Kulik (sickill) + Steve DeWald (sdewald) + Ivan Necas (iNecas) + George Ang (gnap) + Evan Coury (EvanDotPro) + Andrew Radev (AndrewRadev) + Matt Gauger (mathias) + Scott Stevenson (scottstvnsn) + Anderson Freitas (andersonfreitas) + Kamil K. Lemański (kml) + Yehuda Katz (wycats) + Min-Young Wu (minyoung) + Benjamin Geiger (benjamingeiger) + +============================================================================== +8. License *NERDTreeLicense* + +The NERD tree is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. diff --git a/doc/tags b/doc/tags new file mode 100644 index 00000000..c992b304 --- /dev/null +++ b/doc/tags @@ -0,0 +1,7 @@ + +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* +vimtips.txt ../plugin/vimtips/vimtips.txt /*vimtips.txt* diff --git a/ftplugin/python/pyflakes.vim b/ftplugin/python/pyflakes.vim new file mode 100644 index 00000000..5a0b44ce --- /dev/null +++ b/ftplugin/python/pyflakes.vim @@ -0,0 +1,321 @@ +" pyflakes.vim - A script to highlight Python code on the fly with warnings +" from Pyflakes, a Python lint tool. +" +" Place this script and the accompanying pyflakes directory in +" .vim/ftplugin/python. +" +" See README for additional installation and information. +" +" Thanks to matlib.vim for ideas/code on interactive linting. +" +" Maintainer: Kevin Watters +" Version: 0.1 + +if exists("b:did_pyflakes_plugin") + finish " only load once +else + let b:did_pyflakes_plugin = 1 +endif + +if !exists('g:pyflakes_builtins') + let g:pyflakes_builtins = [] +endif + +if !exists("b:did_python_init") + let b:did_python_init = 0 + + if !has('python') + echoerr "Error: the pyflakes.vim plugin requires Vim to be compiled with +python" + finish + endif + +if !exists('g:pyflakes_use_quickfix') + let g:pyflakes_use_quickfix = 1 +endif + + + python << EOF +import vim +import os.path +import sys + +if sys.version_info[:2] < (2, 5): + raise AssertionError('Vim must be compiled with Python 2.5 or higher; you have ' + sys.version) + +# get the directory this script is in: the pyflakes python module should be installed there. +scriptdir = os.path.join(os.path.dirname(vim.eval('expand("")')), 'pyflakes') +sys.path.insert(0, scriptdir) + +import ast +from pyflakes import checker, messages +from operator import attrgetter +import re + +class loc(object): + def __init__(self, lineno, col=None): + self.lineno = lineno + self.col_offset = col + +class SyntaxError(messages.Message): + message = 'could not compile: %s' + def __init__(self, filename, lineno, col, message): + messages.Message.__init__(self, filename, loc(lineno, col)) + self.message_args = (message,) + +class blackhole(object): + write = flush = lambda *a, **k: None + +def check(buffer): + filename = buffer.name + contents = buffer[:] + + # shebang usually found at the top of the file, followed by source code encoding marker. + # assume everything else that follows is encoded in the encoding. + encoding_found = False + for n, line in enumerate(contents): + if n >= 2: + break + elif re.match(r'#.*coding[:=]\s*([-\w.]+)', line): + contents = ['']*(n+1) + contents[n+1:] + break + + contents = '\n'.join(contents) + '\n' + + vimenc = vim.eval('&encoding') + if vimenc: + contents = contents.decode(vimenc) + + builtins = set(['__file__']) + try: + builtins.update(set(eval(vim.eval('string(g:pyflakes_builtins)')))) + except Exception: + pass + + try: + # TODO: use warnings filters instead of ignoring stderr + old_stderr, sys.stderr = sys.stderr, blackhole() + try: + tree = ast.parse(contents, filename or '') + finally: + sys.stderr = old_stderr + except: + try: + value = sys.exc_info()[1] + lineno, offset, line = value[1][1:] + except IndexError: + lineno, offset, line = 1, 0, '' + if line and line.endswith("\n"): + line = line[:-1] + + return [SyntaxError(filename, lineno, offset, str(value))] + else: + # pyflakes looks to _MAGIC_GLOBALS in checker.py to see which + # UndefinedNames to ignore + old_globals = getattr(checker,' _MAGIC_GLOBALS', []) + checker._MAGIC_GLOBALS = set(old_globals) | builtins + + w = checker.Checker(tree, filename) + + checker._MAGIC_GLOBALS = old_globals + + w.messages.sort(key = attrgetter('lineno')) + return w.messages + + +def vim_quote(s): + return s.replace("'", "''") +EOF + let b:did_python_init = 1 +endif + +if !b:did_python_init + finish +endif + +au BufLeave call s:ClearPyflakes() + +au BufEnter call s:RunPyflakes() +au InsertLeave call s:RunPyflakes() +au InsertEnter call s:RunPyflakes() +au BufWritePost call s:RunPyflakes() + +au CursorHold call s:RunPyflakes() +au CursorHoldI call s:RunPyflakes() + +au CursorHold call s:GetPyflakesMessage() +au CursorMoved call s:GetPyflakesMessage() + +if !exists("*s:PyflakesUpdate") + function s:PyflakesUpdate() + silent call s:RunPyflakes() + call s:GetPyflakesMessage() + endfunction +endif + +" Call this function in your .vimrc to update PyFlakes +if !exists(":PyflakesUpdate") + command PyflakesUpdate :call s:PyflakesUpdate() +endif + +" Hook common text manipulation commands to update PyFlakes +" TODO: is there a more general "text op" autocommand we could register +" for here? +noremap dd dd:PyflakesUpdate +noremap dw dw:PyflakesUpdate +noremap u u:PyflakesUpdate +noremap :PyflakesUpdate + +" WideMsg() prints [long] message up to (&columns-1) length +" guaranteed without "Press Enter" prompt. +if !exists("*s:WideMsg") + function s:WideMsg(msg) + let x=&ruler | let y=&showcmd + set noruler noshowcmd + redraw + echo strpart(a:msg, 0, &columns-1) + let &ruler=x | let &showcmd=y + endfun +endif + +if !exists("*s:GetQuickFixStackCount") + function s:GetQuickFixStackCount() + let l:stack_count = 0 + try + silent colder 9 + catch /E380:/ + endtry + + try + for i in range(9) + silent cnewer + let l:stack_count = l:stack_count + 1 + endfor + catch /E381:/ + return l:stack_count + endtry + endfunction +endif + +if !exists("*s:ActivatePyflakesQuickFixWindow") + function s:ActivatePyflakesQuickFixWindow() + try + silent colder 9 " go to the bottom of quickfix stack + catch /E380:/ + endtry + + if s:pyflakes_qf > 0 + try + exe "silent cnewer " . s:pyflakes_qf + catch /E381:/ + echoerr "Could not activate Pyflakes Quickfix Window." + endtry + endif + endfunction +endif + +if !exists("*s:RunPyflakes") + function s:RunPyflakes() + highlight link PyFlakes SpellBad + + if exists("b:cleared") + if b:cleared == 0 + silent call s:ClearPyflakes() + let b:cleared = 1 + endif + else + let b:cleared = 1 + endif + + let b:matched = [] + let b:matchedlines = {} + + let b:qf_list = [] + let b:qf_window_count = -1 + + python << EOF +for w in check(vim.current.buffer): + vim.command('let s:matchDict = {}') + vim.command("let s:matchDict['lineNum'] = " + str(w.lineno)) + vim.command("let s:matchDict['message'] = '%s'" % vim_quote(w.message % w.message_args)) + vim.command("let b:matchedlines[" + str(w.lineno) + "] = s:matchDict") + + vim.command("let l:qf_item = {}") + vim.command("let l:qf_item.bufnr = bufnr('%')") + vim.command("let l:qf_item.filename = expand('%')") + vim.command("let l:qf_item.lnum = %s" % str(w.lineno)) + vim.command("let l:qf_item.text = '%s'" % vim_quote(w.message % w.message_args)) + vim.command("let l:qf_item.type = 'E'") + + if getattr(w, 'col', None) is None or isinstance(w, SyntaxError): + # without column information, just highlight the whole line + # (minus the newline) + vim.command(r"let s:mID = matchadd('PyFlakes', '\%" + str(w.lineno) + r"l\n\@!')") + else: + # with a column number, highlight the first keyword there + vim.command(r"let s:mID = matchadd('PyFlakes', '^\%" + str(w.lineno) + r"l\_.\{-}\zs\k\+\k\@!\%>" + str(w.col) + r"c')") + + vim.command("let l:qf_item.vcol = 1") + vim.command("let l:qf_item.col = %s" % str(w.col + 1)) + + vim.command("call add(b:matched, s:matchDict)") + vim.command("call add(b:qf_list, l:qf_item)") +EOF + if g:pyflakes_use_quickfix == 1 + if exists("s:pyflakes_qf") + " if pyflakes quickfix window is already created, reuse it + call s:ActivatePyflakesQuickFixWindow() + call setqflist(b:qf_list, 'r') + else + " one pyflakes quickfix window for all buffer + call setqflist(b:qf_list, '') + let s:pyflakes_qf = s:GetQuickFixStackCount() + endif + endif + + let b:cleared = 0 + endfunction +end + +" keep track of whether or not we are showing a message +let b:showing_message = 0 + +if !exists("*s:GetPyflakesMessage") + function s:GetPyflakesMessage() + let s:cursorPos = getpos(".") + + " Bail if RunPyflakes hasn't been called yet. + if !exists('b:matchedlines') + return + endif + + " if there's a message for the line the cursor is currently on, echo + " it to the console + if has_key(b:matchedlines, s:cursorPos[1]) + let s:pyflakesMatch = get(b:matchedlines, s:cursorPos[1]) + call s:WideMsg(s:pyflakesMatch['message']) + let b:showing_message = 1 + return + endif + + " otherwise, if we're showing a message, clear it + if b:showing_message == 1 + echo + let b:showing_message = 0 + endif + endfunction +endif + +if !exists('*s:ClearPyflakes') + function s:ClearPyflakes() + let s:matches = getmatches() + for s:matchId in s:matches + if s:matchId['group'] == 'PyFlakes' + call matchdelete(s:matchId['id']) + endif + endfor + let b:matched = [] + let b:matchedlines = {} + let b:cleared = 1 + endfunction +endif + diff --git a/ftplugin/python/pyflakes/LICENSE b/ftplugin/python/pyflakes/LICENSE new file mode 100644 index 00000000..42b8cf3c --- /dev/null +++ b/ftplugin/python/pyflakes/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) 2005 Divmod, Inc., http://www.divmod.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/ftplugin/python/pyflakes/NEWS.txt b/ftplugin/python/pyflakes/NEWS.txt new file mode 100644 index 00000000..2a3e3165 --- /dev/null +++ b/ftplugin/python/pyflakes/NEWS.txt @@ -0,0 +1,29 @@ +0.4.0 (2009-11-25): + - Fix reporting for certain SyntaxErrors which lack line number + information. + - Check for syntax errors more rigorously. + - Support checking names used with the class decorator syntax in versions + of Python which have it. + - Detect local variables which are bound but never used. + - Handle permission errors when trying to read source files. + - Handle problems with the encoding of source files. + - Support importing dotted names so as not to incorrectly report them as + redefined unused names. + - Support all forms of the with statement. + - Consider static `__all__` definitions and avoid reporting unused names + if the names are listed there. + - Fix incorrect checking of class names with respect to the names of their + bases in the class statement. + - Support the `__path__` global in `__init__.py`. + +0.3.0 (2009-01-30): + - Display more informative SyntaxError messages. + - Don't hang flymake with unmatched triple quotes (only report a single + line of source for a multiline syntax error). + - Recognize __builtins__ as a defined name. + - Improve pyflakes support for python versions 2.3-2.5 + - Support for if-else expressions and with statements. + - Warn instead of error on non-existant file paths. + - Check for __future__ imports after other statements. + - Add reporting for some types of import shadowing. + - Improve reporting of unbound locals diff --git a/ftplugin/python/pyflakes/bin/pyflakes b/ftplugin/python/pyflakes/bin/pyflakes new file mode 100644 index 00000000..3f50805a --- /dev/null +++ b/ftplugin/python/pyflakes/bin/pyflakes @@ -0,0 +1,4 @@ +#!/usr/bin/python + +from pyflakes.scripts.pyflakes import main +main() diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/__init__.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/__init__.py new file mode 100644 index 00000000..652a8f47 --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/__init__.py @@ -0,0 +1,2 @@ + +__version__ = '0.4.0' diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/checker.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/checker.py new file mode 100644 index 00000000..7c348b8d --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/checker.py @@ -0,0 +1,625 @@ +# -*- test-case-name: pyflakes -*- +# (c) 2005-2010 Divmod, Inc. +# See LICENSE file for details + +import __builtin__ +import os.path +import _ast + +from pyflakes import messages + + +# utility function to iterate over an AST node's children, adapted +# from Python 2.6's standard ast module +try: + import ast + iter_child_nodes = ast.iter_child_nodes +except (ImportError, AttributeError): + def iter_child_nodes(node, astcls=_ast.AST): + """ + Yield all direct child nodes of *node*, that is, all fields that are nodes + and all items of fields that are lists of nodes. + """ + for name in node._fields: + field = getattr(node, name, None) + if isinstance(field, astcls): + yield field + elif isinstance(field, list): + for item in field: + yield item + + +class Binding(object): + """ + Represents the binding of a value to a name. + + The checker uses this to keep track of which names have been bound and + which names have not. See L{Assignment} for a special type of binding that + is checked with stricter rules. + + @ivar used: pair of (L{Scope}, line-number) indicating the scope and + line number that this binding was last used + """ + + def __init__(self, name, source): + self.name = name + self.source = source + self.used = False + + + def __str__(self): + return self.name + + + def __repr__(self): + return '<%s object %r from line %r at 0x%x>' % (self.__class__.__name__, + self.name, + self.source.lineno, + id(self)) + + + +class UnBinding(Binding): + '''Created by the 'del' operator.''' + + + +class Importation(Binding): + """ + A binding created by an import statement. + + @ivar fullName: The complete name given to the import statement, + possibly including multiple dotted components. + @type fullName: C{str} + """ + def __init__(self, name, source): + self.fullName = name + name = name.split('.')[0] + super(Importation, self).__init__(name, source) + + + +class Argument(Binding): + """ + Represents binding a name as an argument. + """ + + + +class Assignment(Binding): + """ + Represents binding a name with an explicit assignment. + + The checker will raise warnings for any Assignment that isn't used. Also, + the checker does not consider assignments in tuple/list unpacking to be + Assignments, rather it treats them as simple Bindings. + """ + + + +class FunctionDefinition(Binding): + pass + + + +class ExportBinding(Binding): + """ + A binding created by an C{__all__} assignment. If the names in the list + can be determined statically, they will be treated as names for export and + additional checking applied to them. + + The only C{__all__} assignment that can be recognized is one which takes + the value of a literal list containing literal strings. For example:: + + __all__ = ["foo", "bar"] + + Names which are imported and not otherwise used but appear in the value of + C{__all__} will not have an unused import warning reported for them. + """ + def names(self): + """ + Return a list of the names referenced by this binding. + """ + names = [] + if isinstance(self.source, _ast.List): + for node in self.source.elts: + if isinstance(node, _ast.Str): + names.append(node.s) + return names + + + +class Scope(dict): + importStarred = False # set to True when import * is found + + + def __repr__(self): + return '<%s at 0x%x %s>' % (self.__class__.__name__, id(self), dict.__repr__(self)) + + + def __init__(self): + super(Scope, self).__init__() + + + +class ClassScope(Scope): + pass + + + +class FunctionScope(Scope): + """ + I represent a name scope for a function. + + @ivar globals: Names declared 'global' in this function. + """ + def __init__(self): + super(FunctionScope, self).__init__() + self.globals = {} + + + +class ModuleScope(Scope): + pass + + +# Globally defined names which are not attributes of the __builtin__ module. +_MAGIC_GLOBALS = ['__file__', '__builtins__'] + + + +class Checker(object): + """ + I check the cleanliness and sanity of Python code. + + @ivar _deferredFunctions: Tracking list used by L{deferFunction}. Elements + of the list are two-tuples. The first element is the callable passed + to L{deferFunction}. The second element is a copy of the scope stack + at the time L{deferFunction} was called. + + @ivar _deferredAssignments: Similar to C{_deferredFunctions}, but for + callables which are deferred assignment checks. + """ + + nodeDepth = 0 + traceTree = False + + def __init__(self, tree, filename='(none)'): + self._deferredFunctions = [] + self._deferredAssignments = [] + self.dead_scopes = [] + self.messages = [] + self.filename = filename + self.scopeStack = [ModuleScope()] + self.futuresAllowed = True + self.handleChildren(tree) + self._runDeferred(self._deferredFunctions) + # Set _deferredFunctions to None so that deferFunction will fail + # noisily if called after we've run through the deferred functions. + self._deferredFunctions = None + self._runDeferred(self._deferredAssignments) + # Set _deferredAssignments to None so that deferAssignment will fail + # noisly if called after we've run through the deferred assignments. + self._deferredAssignments = None + del self.scopeStack[1:] + self.popScope() + self.check_dead_scopes() + + + def deferFunction(self, callable): + ''' + Schedule a function handler to be called just before completion. + + This is used for handling function bodies, which must be deferred + because code later in the file might modify the global scope. When + `callable` is called, the scope at the time this is called will be + restored, however it will contain any new bindings added to it. + ''' + self._deferredFunctions.append((callable, self.scopeStack[:])) + + + def deferAssignment(self, callable): + """ + Schedule an assignment handler to be called just after deferred + function handlers. + """ + self._deferredAssignments.append((callable, self.scopeStack[:])) + + + def _runDeferred(self, deferred): + """ + Run the callables in C{deferred} using their associated scope stack. + """ + for handler, scope in deferred: + self.scopeStack = scope + handler() + + + def scope(self): + return self.scopeStack[-1] + scope = property(scope) + + def popScope(self): + self.dead_scopes.append(self.scopeStack.pop()) + + + def check_dead_scopes(self): + """ + Look at scopes which have been fully examined and report names in them + which were imported but unused. + """ + for scope in self.dead_scopes: + export = isinstance(scope.get('__all__'), ExportBinding) + if export: + all = scope['__all__'].names() + if os.path.split(self.filename)[1] != '__init__.py': + # Look for possible mistakes in the export list + undefined = set(all) - set(scope) + for name in undefined: + self.report( + messages.UndefinedExport, + scope['__all__'].source, + name) + else: + all = [] + + # Look for imported names that aren't used. + for importation in scope.itervalues(): + if isinstance(importation, Importation): + if not importation.used and importation.name not in all: + self.report( + messages.UnusedImport, + importation.source, + importation.name) + + + def pushFunctionScope(self): + self.scopeStack.append(FunctionScope()) + + def pushClassScope(self): + self.scopeStack.append(ClassScope()) + + def report(self, messageClass, *args, **kwargs): + self.messages.append(messageClass(self.filename, *args, **kwargs)) + + def handleChildren(self, tree): + for node in iter_child_nodes(tree): + self.handleNode(node, tree) + + def isDocstring(self, node): + """ + Determine if the given node is a docstring, as long as it is at the + correct place in the node tree. + """ + return isinstance(node, _ast.Str) or \ + (isinstance(node, _ast.Expr) and + isinstance(node.value, _ast.Str)) + + def handleNode(self, node, parent): + node.parent = parent + if self.traceTree: + print ' ' * self.nodeDepth + node.__class__.__name__ + self.nodeDepth += 1 + if self.futuresAllowed and not \ + (isinstance(node, _ast.ImportFrom) or self.isDocstring(node)): + self.futuresAllowed = False + nodeType = node.__class__.__name__.upper() + try: + handler = getattr(self, nodeType) + handler(node) + finally: + self.nodeDepth -= 1 + if self.traceTree: + print ' ' * self.nodeDepth + 'end ' + node.__class__.__name__ + + def ignore(self, node): + pass + + # "stmt" type nodes + RETURN = DELETE = PRINT = WHILE = IF = WITH = RAISE = TRYEXCEPT = \ + TRYFINALLY = ASSERT = EXEC = EXPR = handleChildren + + CONTINUE = BREAK = PASS = ignore + + # "expr" type nodes + BOOLOP = BINOP = UNARYOP = IFEXP = DICT = SET = YIELD = COMPARE = \ + CALL = REPR = ATTRIBUTE = SUBSCRIPT = LIST = TUPLE = handleChildren + + NUM = STR = ELLIPSIS = ignore + + # "slice" type nodes + SLICE = EXTSLICE = INDEX = handleChildren + + # expression contexts are node instances too, though being constants + LOAD = STORE = DEL = AUGLOAD = AUGSTORE = PARAM = ignore + + # same for operators + AND = OR = ADD = SUB = MULT = DIV = MOD = POW = LSHIFT = RSHIFT = \ + BITOR = BITXOR = BITAND = FLOORDIV = INVERT = NOT = UADD = USUB = \ + EQ = NOTEQ = LT = LTE = GT = GTE = IS = ISNOT = IN = NOTIN = ignore + + # additional node types + COMPREHENSION = EXCEPTHANDLER = KEYWORD = handleChildren + + def addBinding(self, loc, value, reportRedef=True): + '''Called when a binding is altered. + + - `loc` is the location (an object with lineno and optionally + col_offset attributes) of the statement responsible for the change + - `value` is the optional new value, a Binding instance, associated + with the binding; if None, the binding is deleted if it exists. + - if `reportRedef` is True (default), rebinding while unused will be + reported. + ''' + if (isinstance(self.scope.get(value.name), FunctionDefinition) + and isinstance(value, FunctionDefinition)): + self.report(messages.RedefinedFunction, + loc, value.name, self.scope[value.name].source) + + if not isinstance(self.scope, ClassScope): + for scope in self.scopeStack[::-1]: + existing = scope.get(value.name) + if (isinstance(existing, Importation) + and not existing.used + and (not isinstance(value, Importation) or value.fullName == existing.fullName) + and reportRedef): + + self.report(messages.RedefinedWhileUnused, + loc, value.name, scope[value.name].source) + + if isinstance(value, UnBinding): + try: + del self.scope[value.name] + except KeyError: + self.report(messages.UndefinedName, loc, value.name) + else: + self.scope[value.name] = value + + def GLOBAL(self, node): + """ + Keep track of globals declarations. + """ + if isinstance(self.scope, FunctionScope): + self.scope.globals.update(dict.fromkeys(node.names)) + + def LISTCOMP(self, node): + # handle generators before element + for gen in node.generators: + self.handleNode(gen, node) + self.handleNode(node.elt, node) + + GENERATOREXP = SETCOMP = LISTCOMP + + # dictionary comprehensions; introduced in Python 2.7 + def DICTCOMP(self, node): + for gen in node.generators: + self.handleNode(gen, node) + self.handleNode(node.key, node) + self.handleNode(node.value, node) + + def FOR(self, node): + """ + Process bindings for loop variables. + """ + vars = [] + def collectLoopVars(n): + if isinstance(n, _ast.Name): + vars.append(n.id) + elif isinstance(n, _ast.expr_context): + return + else: + for c in iter_child_nodes(n): + collectLoopVars(c) + + collectLoopVars(node.target) + for varn in vars: + if (isinstance(self.scope.get(varn), Importation) + # unused ones will get an unused import warning + and self.scope[varn].used): + self.report(messages.ImportShadowedByLoopVar, + node, varn, self.scope[varn].source) + + self.handleChildren(node) + + def NAME(self, node): + """ + Handle occurrence of Name (which can be a load/store/delete access.) + """ + # Locate the name in locals / function / globals scopes. + if isinstance(node.ctx, (_ast.Load, _ast.AugLoad)): + # try local scope + importStarred = self.scope.importStarred + try: + self.scope[node.id].used = (self.scope, node) + except KeyError: + pass + else: + return + + # try enclosing function scopes + + for scope in self.scopeStack[-2:0:-1]: + importStarred = importStarred or scope.importStarred + if not isinstance(scope, FunctionScope): + continue + try: + scope[node.id].used = (self.scope, node) + except KeyError: + pass + else: + return + + # try global scope + + importStarred = importStarred or self.scopeStack[0].importStarred + try: + self.scopeStack[0][node.id].used = (self.scope, node) + except KeyError: + if ((not hasattr(__builtin__, node.id)) + and node.id not in _MAGIC_GLOBALS + and not importStarred): + if (os.path.basename(self.filename) == '__init__.py' and + node.id == '__path__'): + # the special name __path__ is valid only in packages + pass + else: + self.report(messages.UndefinedName, node, node.id) + elif isinstance(node.ctx, (_ast.Store, _ast.AugStore)): + # if the name hasn't already been defined in the current scope + if isinstance(self.scope, FunctionScope) and node.id not in self.scope: + # for each function or module scope above us + for scope in self.scopeStack[:-1]: + if not isinstance(scope, (FunctionScope, ModuleScope)): + continue + # if the name was defined in that scope, and the name has + # been accessed already in the current scope, and hasn't + # been declared global + if (node.id in scope + and scope[node.id].used + and scope[node.id].used[0] is self.scope + and node.id not in self.scope.globals): + # then it's probably a mistake + self.report(messages.UndefinedLocal, + scope[node.id].used[1], + node.id, + scope[node.id].source) + break + + if isinstance(node.parent, + (_ast.For, _ast.comprehension, _ast.Tuple, _ast.List)): + binding = Binding(node.id, node) + elif (node.id == '__all__' and + isinstance(self.scope, ModuleScope)): + binding = ExportBinding(node.id, node.parent.value) + else: + binding = Assignment(node.id, node) + if node.id in self.scope: + binding.used = self.scope[node.id].used + self.addBinding(node, binding) + elif isinstance(node.ctx, _ast.Del): + if isinstance(self.scope, FunctionScope) and \ + node.id in self.scope.globals: + del self.scope.globals[node.id] + else: + self.addBinding(node, UnBinding(node.id, node)) + else: + # must be a Param context -- this only happens for names in function + # arguments, but these aren't dispatched through here + raise RuntimeError( + "Got impossible expression context: %r" % (node.ctx,)) + + + def FUNCTIONDEF(self, node): + # the decorators attribute is called decorator_list as of Python 2.6 + if hasattr(node, 'decorators'): + for deco in node.decorators: + self.handleNode(deco, node) + else: + for deco in node.decorator_list: + self.handleNode(deco, node) + self.addBinding(node, FunctionDefinition(node.name, node)) + self.LAMBDA(node) + + def LAMBDA(self, node): + for default in node.args.defaults: + self.handleNode(default, node) + + def runFunction(): + args = [] + + def addArgs(arglist): + for arg in arglist: + if isinstance(arg, _ast.Tuple): + addArgs(arg.elts) + else: + if arg.id in args: + self.report(messages.DuplicateArgument, + node, arg.id) + args.append(arg.id) + + self.pushFunctionScope() + addArgs(node.args.args) + # vararg/kwarg identifiers are not Name nodes + if node.args.vararg: + args.append(node.args.vararg) + if node.args.kwarg: + args.append(node.args.kwarg) + for name in args: + self.addBinding(node, Argument(name, node), reportRedef=False) + if isinstance(node.body, list): + # case for FunctionDefs + for stmt in node.body: + self.handleNode(stmt, node) + else: + # case for Lambdas + self.handleNode(node.body, node) + def checkUnusedAssignments(): + """ + Check to see if any assignments have not been used. + """ + for name, binding in self.scope.iteritems(): + if (not binding.used and not name in self.scope.globals + and isinstance(binding, Assignment)): + self.report(messages.UnusedVariable, + binding.source, name) + self.deferAssignment(checkUnusedAssignments) + self.popScope() + + self.deferFunction(runFunction) + + + def CLASSDEF(self, node): + """ + Check names used in a class definition, including its decorators, base + classes, and the body of its definition. Additionally, add its name to + the current scope. + """ + # decorator_list is present as of Python 2.6 + for deco in getattr(node, 'decorator_list', []): + self.handleNode(deco, node) + for baseNode in node.bases: + self.handleNode(baseNode, node) + self.pushClassScope() + for stmt in node.body: + self.handleNode(stmt, node) + self.popScope() + self.addBinding(node, Binding(node.name, node)) + + def ASSIGN(self, node): + self.handleNode(node.value, node) + for target in node.targets: + self.handleNode(target, node) + + def AUGASSIGN(self, node): + # AugAssign is awkward: must set the context explicitly and visit twice, + # once with AugLoad context, once with AugStore context + node.target.ctx = _ast.AugLoad() + self.handleNode(node.target, node) + self.handleNode(node.value, node) + node.target.ctx = _ast.AugStore() + self.handleNode(node.target, node) + + def IMPORT(self, node): + for alias in node.names: + name = alias.asname or alias.name + importation = Importation(name, node) + self.addBinding(node, importation) + + def IMPORTFROM(self, node): + if node.module == '__future__': + if not self.futuresAllowed: + self.report(messages.LateFutureImport, node, + [n.name for n in node.names]) + else: + self.futuresAllowed = False + + for alias in node.names: + if alias.name == '*': + self.scope.importStarred = True + self.report(messages.ImportStarUsed, node, node.module) + continue + name = alias.asname or alias.name + importation = Importation(name, node) + if node.module == '__future__': + importation.used = (self.scope, node) + self.addBinding(node, importation) diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/messages.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/messages.py new file mode 100644 index 00000000..73bf4cc3 --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/messages.py @@ -0,0 +1,96 @@ +# (c) 2005 Divmod, Inc. See LICENSE file for details + +class Message(object): + message = '' + message_args = () + def __init__(self, filename, loc, use_column=True): + self.filename = filename + self.lineno = loc.lineno + self.col = getattr(loc, 'col_offset', None) if use_column else None + + def __str__(self): + return '%s:%s: %s' % (self.filename, self.lineno, self.message % self.message_args) + + +class UnusedImport(Message): + message = '%r imported but unused' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc, use_column=False) + self.message_args = (name,) + + +class RedefinedWhileUnused(Message): + message = 'redefinition of unused %r from line %r' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class ImportShadowedByLoopVar(Message): + message = 'import %r from line %r shadowed by loop variable' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class ImportStarUsed(Message): + message = "'from %s import *' used; unable to detect undefined names" + def __init__(self, filename, loc, modname): + Message.__init__(self, filename, loc) + self.message_args = (modname,) + + +class UndefinedName(Message): + message = 'undefined name %r' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + + +class UndefinedExport(Message): + message = 'undefined name %r in __all__' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + + +class UndefinedLocal(Message): + message = "local variable %r (defined in enclosing scope on line %r) referenced before assignment" + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class DuplicateArgument(Message): + message = 'duplicate argument %r in function definition' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + +class RedefinedFunction(Message): + message = 'redefinition of function %r from line %r' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class LateFutureImport(Message): + message = 'future import(s) %r after other statements' + def __init__(self, filename, loc, names): + Message.__init__(self, filename, loc) + self.message_args = (names,) + + +class UnusedVariable(Message): + """ + Indicates that a variable has been explicity assigned to but not actually + used. + """ + + message = 'local variable %r is assigned to but never used' + def __init__(self, filename, loc, names): + Message.__init__(self, filename, loc) + self.message_args = (names,) diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/__init__.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/pyflakes.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/pyflakes.py new file mode 100644 index 00000000..6b1dae22 --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/scripts/pyflakes.py @@ -0,0 +1,90 @@ + +""" +Implementation of the command-line I{pyflakes} tool. +""" + +import sys +import os +import _ast + +checker = __import__('pyflakes.checker').checker + +def check(codeString, filename): + """ + Check the Python source given by C{codeString} for flakes. + + @param codeString: The Python source to check. + @type codeString: C{str} + + @param filename: The name of the file the source came from, used to report + errors. + @type filename: C{str} + + @return: The number of warnings emitted. + @rtype: C{int} + """ + # First, compile into an AST and handle syntax errors. + try: + tree = compile(codeString, filename, "exec", _ast.PyCF_ONLY_AST) + except SyntaxError, value: + msg = value.args[0] + + (lineno, offset, text) = value.lineno, value.offset, value.text + + # If there's an encoding problem with the file, the text is None. + if text is None: + # Avoid using msg, since for the only known case, it contains a + # bogus message that claims the encoding the file declared was + # unknown. + print >> sys.stderr, "%s: problem decoding source" % (filename, ) + else: + line = text.splitlines()[-1] + + if offset is not None: + offset = offset - (len(text) - len(line)) + + print >> sys.stderr, '%s:%d: %s' % (filename, lineno, msg) + print >> sys.stderr, line + + if offset is not None: + print >> sys.stderr, " " * offset, "^" + + return 1 + else: + # Okay, it's syntactically valid. Now check it. + w = checker.Checker(tree, filename) + w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno)) + for warning in w.messages: + print warning + return len(w.messages) + + +def checkPath(filename): + """ + Check the given path, printing out any warnings detected. + + @return: the number of warnings printed + """ + try: + return check(file(filename, 'U').read() + '\n', filename) + except IOError, msg: + print >> sys.stderr, "%s: %s" % (filename, msg.args[1]) + return 1 + + +def main(): + warnings = 0 + args = sys.argv[1:] + if args: + for arg in args: + if os.path.isdir(arg): + for dirpath, dirnames, filenames in os.walk(arg): + for filename in filenames: + if filename.endswith('.py'): + warnings += checkPath(os.path.join(dirpath, filename)) + else: + warnings += checkPath(arg) + else: + warnings += check(sys.stdin.read(), '') + + raise SystemExit(warnings > 0) diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/__init__.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/harness.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/harness.py new file mode 100644 index 00000000..7cd22772 --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/harness.py @@ -0,0 +1,27 @@ + +import textwrap +import _ast + +from twisted.trial import unittest + +from pyflakes import checker + + +class Test(unittest.TestCase): + + def flakes(self, input, *expectedOutputs, **kw): + ast = compile(textwrap.dedent(input), "", "exec", + _ast.PyCF_ONLY_AST) + w = checker.Checker(ast, **kw) + outputs = [type(o) for o in w.messages] + expectedOutputs = list(expectedOutputs) + outputs.sort() + expectedOutputs.sort() + self.assert_(outputs == expectedOutputs, '''\ +for input: +%s +expected outputs: +%s +but got: +%s''' % (input, repr(expectedOutputs), '\n'.join([str(o) for o in w.messages]))) + return w diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_imports.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_imports.py new file mode 100644 index 00000000..08e4580a --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_imports.py @@ -0,0 +1,673 @@ + +from sys import version_info + +from pyflakes import messages as m +from pyflakes.test import harness + +class Test(harness.Test): + + def test_unusedImport(self): + self.flakes('import fu, bar', m.UnusedImport, m.UnusedImport) + self.flakes('from baz import fu, bar', m.UnusedImport, m.UnusedImport) + + def test_aliasedImport(self): + self.flakes('import fu as FU, bar as FU', m.RedefinedWhileUnused, m.UnusedImport) + self.flakes('from moo import fu as FU, bar as FU', m.RedefinedWhileUnused, m.UnusedImport) + + def test_usedImport(self): + self.flakes('import fu; print fu') + self.flakes('from baz import fu; print fu') + + def test_redefinedWhileUnused(self): + self.flakes('import fu; fu = 3', m.RedefinedWhileUnused) + self.flakes('import fu; del fu', m.RedefinedWhileUnused) + self.flakes('import fu; fu, bar = 3', m.RedefinedWhileUnused) + self.flakes('import fu; [fu, bar] = 3', m.RedefinedWhileUnused) + + def test_redefinedByFunction(self): + self.flakes(''' + import fu + def fu(): + pass + ''', m.RedefinedWhileUnused) + + def test_redefinedInNestedFunction(self): + """ + Test that shadowing a global name with a nested function definition + generates a warning. + """ + self.flakes(''' + import fu + def bar(): + def baz(): + def fu(): + pass + ''', m.RedefinedWhileUnused, m.UnusedImport) + + def test_redefinedByClass(self): + self.flakes(''' + import fu + class fu: + pass + ''', m.RedefinedWhileUnused) + + + def test_redefinedBySubclass(self): + """ + If an imported name is redefined by a class statement which also uses + that name in the bases list, no warning is emitted. + """ + self.flakes(''' + from fu import bar + class bar(bar): + pass + ''') + + + def test_redefinedInClass(self): + """ + Test that shadowing a global with a class attribute does not produce a + warning. + """ + self.flakes(''' + import fu + class bar: + fu = 1 + print fu + ''') + + def test_usedInFunction(self): + self.flakes(''' + import fu + def fun(): + print fu + ''') + + def test_shadowedByParameter(self): + self.flakes(''' + import fu + def fun(fu): + print fu + ''', m.UnusedImport) + + self.flakes(''' + import fu + def fun(fu): + print fu + print fu + ''') + + def test_newAssignment(self): + self.flakes('fu = None') + + def test_usedInGetattr(self): + self.flakes('import fu; fu.bar.baz') + self.flakes('import fu; "bar".fu.baz', m.UnusedImport) + + def test_usedInSlice(self): + self.flakes('import fu; print fu.bar[1:]') + + def test_usedInIfBody(self): + self.flakes(''' + import fu + if True: print fu + ''') + + def test_usedInIfConditional(self): + self.flakes(''' + import fu + if fu: pass + ''') + + def test_usedInElifConditional(self): + self.flakes(''' + import fu + if False: pass + elif fu: pass + ''') + + def test_usedInElse(self): + self.flakes(''' + import fu + if False: pass + else: print fu + ''') + + def test_usedInCall(self): + self.flakes('import fu; fu.bar()') + + def test_usedInClass(self): + self.flakes(''' + import fu + class bar: + bar = fu + ''') + + def test_usedInClassBase(self): + self.flakes(''' + import fu + class bar(object, fu.baz): + pass + ''') + + def test_notUsedInNestedScope(self): + self.flakes(''' + import fu + def bleh(): + pass + print fu + ''') + + def test_usedInFor(self): + self.flakes(''' + import fu + for bar in range(9): + print fu + ''') + + def test_usedInForElse(self): + self.flakes(''' + import fu + for bar in range(10): + pass + else: + print fu + ''') + + def test_redefinedByFor(self): + self.flakes(''' + import fu + for fu in range(2): + pass + ''', m.RedefinedWhileUnused) + + def test_shadowedByFor(self): + """ + Test that shadowing a global name with a for loop variable generates a + warning. + """ + self.flakes(''' + import fu + fu.bar() + for fu in (): + pass + ''', m.ImportShadowedByLoopVar) + + def test_shadowedByForDeep(self): + """ + Test that shadowing a global name with a for loop variable nested in a + tuple unpack generates a warning. + """ + self.flakes(''' + import fu + fu.bar() + for (x, y, z, (a, b, c, (fu,))) in (): + pass + ''', m.ImportShadowedByLoopVar) + + def test_usedInReturn(self): + self.flakes(''' + import fu + def fun(): + return fu + ''') + + def test_usedInOperators(self): + self.flakes('import fu; 3 + fu.bar') + self.flakes('import fu; 3 % fu.bar') + self.flakes('import fu; 3 - fu.bar') + self.flakes('import fu; 3 * fu.bar') + self.flakes('import fu; 3 ** fu.bar') + self.flakes('import fu; 3 / fu.bar') + self.flakes('import fu; 3 // fu.bar') + self.flakes('import fu; -fu.bar') + self.flakes('import fu; ~fu.bar') + self.flakes('import fu; 1 == fu.bar') + self.flakes('import fu; 1 | fu.bar') + self.flakes('import fu; 1 & fu.bar') + self.flakes('import fu; 1 ^ fu.bar') + self.flakes('import fu; 1 >> fu.bar') + self.flakes('import fu; 1 << fu.bar') + + def test_usedInAssert(self): + self.flakes('import fu; assert fu.bar') + + def test_usedInSubscript(self): + self.flakes('import fu; fu.bar[1]') + + def test_usedInLogic(self): + self.flakes('import fu; fu and False') + self.flakes('import fu; fu or False') + self.flakes('import fu; not fu.bar') + + def test_usedInList(self): + self.flakes('import fu; [fu]') + + def test_usedInTuple(self): + self.flakes('import fu; (fu,)') + + def test_usedInTry(self): + self.flakes(''' + import fu + try: fu + except: pass + ''') + + def test_usedInExcept(self): + self.flakes(''' + import fu + try: fu + except: pass + ''') + + def test_redefinedByExcept(self): + self.flakes(''' + import fu + try: pass + except Exception, fu: pass + ''', m.RedefinedWhileUnused) + + def test_usedInRaise(self): + self.flakes(''' + import fu + raise fu.bar + ''') + + def test_usedInYield(self): + self.flakes(''' + import fu + def gen(): + yield fu + ''') + + def test_usedInDict(self): + self.flakes('import fu; {fu:None}') + self.flakes('import fu; {1:fu}') + + def test_usedInParameterDefault(self): + self.flakes(''' + import fu + def f(bar=fu): + pass + ''') + + def test_usedInAttributeAssign(self): + self.flakes('import fu; fu.bar = 1') + + def test_usedInKeywordArg(self): + self.flakes('import fu; fu.bar(stuff=fu)') + + def test_usedInAssignment(self): + self.flakes('import fu; bar=fu') + self.flakes('import fu; n=0; n+=fu') + + def test_usedInListComp(self): + self.flakes('import fu; [fu for _ in range(1)]') + self.flakes('import fu; [1 for _ in range(1) if fu]') + + def test_redefinedByListComp(self): + self.flakes('import fu; [1 for fu in range(1)]', m.RedefinedWhileUnused) + + + def test_usedInTryFinally(self): + self.flakes(''' + import fu + try: pass + finally: fu + ''') + + self.flakes(''' + import fu + try: fu + finally: pass + ''') + + def test_usedInWhile(self): + self.flakes(''' + import fu + while 0: + fu + ''') + + self.flakes(''' + import fu + while fu: pass + ''') + + def test_usedInGlobal(self): + self.flakes(''' + import fu + def f(): global fu + ''', m.UnusedImport) + + def test_usedInBackquote(self): + self.flakes('import fu; `fu`') + + def test_usedInExec(self): + self.flakes('import fu; exec "print 1" in fu.bar') + + def test_usedInLambda(self): + self.flakes('import fu; lambda: fu') + + def test_shadowedByLambda(self): + self.flakes('import fu; lambda fu: fu', m.UnusedImport) + + def test_usedInSliceObj(self): + self.flakes('import fu; "meow"[::fu]') + + def test_unusedInNestedScope(self): + self.flakes(''' + def bar(): + import fu + fu + ''', m.UnusedImport, m.UndefinedName) + + def test_methodsDontUseClassScope(self): + self.flakes(''' + class bar: + import fu + def fun(self): + fu + ''', m.UnusedImport, m.UndefinedName) + + def test_nestedFunctionsNestScope(self): + self.flakes(''' + def a(): + def b(): + fu + import fu + ''') + + def test_nestedClassAndFunctionScope(self): + self.flakes(''' + def a(): + import fu + class b: + def c(self): + print fu + ''') + + def test_importStar(self): + self.flakes('from fu import *', m.ImportStarUsed) + + + def test_packageImport(self): + """ + If a dotted name is imported and used, no warning is reported. + """ + self.flakes(''' + import fu.bar + fu.bar + ''') + + + def test_unusedPackageImport(self): + """ + If a dotted name is imported and not used, an unused import warning is + reported. + """ + self.flakes('import fu.bar', m.UnusedImport) + + + def test_duplicateSubmoduleImport(self): + """ + If a submodule of a package is imported twice, an unused import warning + and a redefined while unused warning are reported. + """ + self.flakes(''' + import fu.bar, fu.bar + fu.bar + ''', m.RedefinedWhileUnused) + self.flakes(''' + import fu.bar + import fu.bar + fu.bar + ''', m.RedefinedWhileUnused) + + + def test_differentSubmoduleImport(self): + """ + If two different submodules of a package are imported, no duplicate + import warning is reported for the package. + """ + self.flakes(''' + import fu.bar, fu.baz + fu.bar, fu.baz + ''') + self.flakes(''' + import fu.bar + import fu.baz + fu.bar, fu.baz + ''') + + def test_assignRHSFirst(self): + self.flakes('import fu; fu = fu') + self.flakes('import fu; fu, bar = fu') + self.flakes('import fu; [fu, bar] = fu') + self.flakes('import fu; fu += fu') + + def test_tryingMultipleImports(self): + self.flakes(''' + try: + import fu + except ImportError: + import bar as fu + ''') + test_tryingMultipleImports.todo = '' + + def test_nonGlobalDoesNotRedefine(self): + self.flakes(''' + import fu + def a(): + fu = 3 + return fu + fu + ''') + + def test_functionsRunLater(self): + self.flakes(''' + def a(): + fu + import fu + ''') + + def test_functionNamesAreBoundNow(self): + self.flakes(''' + import fu + def fu(): + fu + fu + ''', m.RedefinedWhileUnused) + + def test_ignoreNonImportRedefinitions(self): + self.flakes('a = 1; a = 2') + + def test_importingForImportError(self): + self.flakes(''' + try: + import fu + except ImportError: + pass + ''') + test_importingForImportError.todo = '' + + def test_importedInClass(self): + '''Imports in class scope can be used through self''' + self.flakes(''' + class c: + import i + def __init__(self): + self.i + ''') + test_importedInClass.todo = 'requires evaluating attribute access' + + def test_futureImport(self): + '''__future__ is special''' + self.flakes('from __future__ import division') + self.flakes(''' + "docstring is allowed before future import" + from __future__ import division + ''') + + def test_futureImportFirst(self): + """ + __future__ imports must come before anything else. + """ + self.flakes(''' + x = 5 + from __future__ import division + ''', m.LateFutureImport) + self.flakes(''' + from foo import bar + from __future__ import division + bar + ''', m.LateFutureImport) + + + +class TestSpecialAll(harness.Test): + """ + Tests for suppression of unused import warnings by C{__all__}. + """ + def test_ignoredInFunction(self): + """ + An C{__all__} definition does not suppress unused import warnings in a + function scope. + """ + self.flakes(''' + def foo(): + import bar + __all__ = ["bar"] + ''', m.UnusedImport, m.UnusedVariable) + + + def test_ignoredInClass(self): + """ + An C{__all__} definition does not suppress unused import warnings in a + class scope. + """ + self.flakes(''' + class foo: + import bar + __all__ = ["bar"] + ''', m.UnusedImport) + + + def test_warningSuppressed(self): + """ + If a name is imported and unused but is named in C{__all__}, no warning + is reported. + """ + self.flakes(''' + import foo + __all__ = ["foo"] + ''') + + + def test_unrecognizable(self): + """ + If C{__all__} is defined in a way that can't be recognized statically, + it is ignored. + """ + self.flakes(''' + import foo + __all__ = ["f" + "oo"] + ''', m.UnusedImport) + self.flakes(''' + import foo + __all__ = [] + ["foo"] + ''', m.UnusedImport) + + + def test_unboundExported(self): + """ + If C{__all__} includes a name which is not bound, a warning is emitted. + """ + self.flakes(''' + __all__ = ["foo"] + ''', m.UndefinedExport) + + # Skip this in __init__.py though, since the rules there are a little + # different. + for filename in ["foo/__init__.py", "__init__.py"]: + self.flakes(''' + __all__ = ["foo"] + ''', filename=filename) + + + def test_usedInGenExp(self): + """ + Using a global in a generator expression results in no warnings. + """ + self.flakes('import fu; (fu for _ in range(1))') + self.flakes('import fu; (1 for _ in range(1) if fu)') + + + def test_redefinedByGenExp(self): + """ + Re-using a global name as the loop variable for a generator + expression results in a redefinition warning. + """ + self.flakes('import fu; (1 for fu in range(1))', m.RedefinedWhileUnused) + + + def test_usedAsDecorator(self): + """ + Using a global name in a decorator statement results in no warnings, + but using an undefined name in a decorator statement results in an + undefined name warning. + """ + self.flakes(''' + from interior import decorate + @decorate + def f(): + return "hello" + ''') + + self.flakes(''' + from interior import decorate + @decorate('value') + def f(): + return "hello" + ''') + + self.flakes(''' + @decorate + def f(): + return "hello" + ''', m.UndefinedName) + + +class Python26Tests(harness.Test): + """ + Tests for checking of syntax which is valid in PYthon 2.6 and newer. + """ + if version_info < (2, 6): + skip = "Python 2.6 required for class decorator tests." + + + def test_usedAsClassDecorator(self): + """ + Using an imported name as a class decorator results in no warnings, + but using an undefined name as a class decorator results in an + undefined name warning. + """ + self.flakes(''' + from interior import decorate + @decorate + class foo: + pass + ''') + + self.flakes(''' + from interior import decorate + @decorate("foo") + class bar: + pass + ''') + + self.flakes(''' + @decorate + class foo: + pass + ''', m.UndefinedName) diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_other.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_other.py new file mode 100644 index 00000000..2b7723ce --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_other.py @@ -0,0 +1,575 @@ +# (c) 2005-2010 Divmod, Inc. +# See LICENSE file for details + +""" +Tests for various Pyflakes behavior. +""" + +from sys import version_info + +from pyflakes import messages as m +from pyflakes.test import harness + + +class Test(harness.Test): + + def test_duplicateArgs(self): + self.flakes('def fu(bar, bar): pass', m.DuplicateArgument) + + def test_localReferencedBeforeAssignment(self): + self.flakes(''' + a = 1 + def f(): + a; a=1 + f() + ''', m.UndefinedName) + test_localReferencedBeforeAssignment.todo = 'this requires finding all assignments in the function body first' + + def test_redefinedFunction(self): + """ + Test that shadowing a function definition with another one raises a + warning. + """ + self.flakes(''' + def a(): pass + def a(): pass + ''', m.RedefinedFunction) + + def test_redefinedClassFunction(self): + """ + Test that shadowing a function definition in a class suite with another + one raises a warning. + """ + self.flakes(''' + class A: + def a(): pass + def a(): pass + ''', m.RedefinedFunction) + + def test_functionDecorator(self): + """ + Test that shadowing a function definition with a decorated version of + that function does not raise a warning. + """ + self.flakes(''' + from somewhere import somedecorator + + def a(): pass + a = somedecorator(a) + ''') + + def test_classFunctionDecorator(self): + """ + Test that shadowing a function definition in a class suite with a + decorated version of that function does not raise a warning. + """ + self.flakes(''' + class A: + def a(): pass + a = classmethod(a) + ''') + + def test_unaryPlus(self): + '''Don't die on unary +''' + self.flakes('+1') + + + def test_undefinedBaseClass(self): + """ + If a name in the base list of a class definition is undefined, a + warning is emitted. + """ + self.flakes(''' + class foo(foo): + pass + ''', m.UndefinedName) + + + def test_classNameUndefinedInClassBody(self): + """ + If a class name is used in the body of that class's definition and + the name is not already defined, a warning is emitted. + """ + self.flakes(''' + class foo: + foo + ''', m.UndefinedName) + + + def test_classNameDefinedPreviously(self): + """ + If a class name is used in the body of that class's definition and + the name was previously defined in some other way, no warning is + emitted. + """ + self.flakes(''' + foo = None + class foo: + foo + ''') + + + def test_comparison(self): + """ + If a defined name is used on either side of any of the six comparison + operators, no warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x < y + x <= y + x == y + x != y + x >= y + x > y + ''') + + + def test_identity(self): + """ + If a deefined name is used on either side of an identity test, no + warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x is y + x is not y + ''') + + + def test_containment(self): + """ + If a defined name is used on either side of a containment test, no + warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x in y + x not in y + ''') + + + def test_loopControl(self): + """ + break and continue statements are supported. + """ + self.flakes(''' + for x in [1, 2]: + break + ''') + self.flakes(''' + for x in [1, 2]: + continue + ''') + + + def test_ellipsis(self): + """ + Ellipsis in a slice is supported. + """ + self.flakes(''' + [1, 2][...] + ''') + + + def test_extendedSlice(self): + """ + Extended slices are supported. + """ + self.flakes(''' + x = 3 + [1, 2][x,:] + ''') + + + +class TestUnusedAssignment(harness.Test): + """ + Tests for warning about unused assignments. + """ + + def test_unusedVariable(self): + """ + Warn when a variable in a function is assigned a value that's never + used. + """ + self.flakes(''' + def a(): + b = 1 + ''', m.UnusedVariable) + + + def test_assignToGlobal(self): + """ + Assigning to a global and then not using that global is perfectly + acceptable. Do not mistake it for an unused local variable. + """ + self.flakes(''' + b = 0 + def a(): + global b + b = 1 + ''') + + + def test_assignToMember(self): + """ + Assigning to a member of another object and then not using that member + variable is perfectly acceptable. Do not mistake it for an unused + local variable. + """ + # XXX: Adding this test didn't generate a failure. Maybe not + # necessary? + self.flakes(''' + class b: + pass + def a(): + b.foo = 1 + ''') + + + def test_assignInForLoop(self): + """ + Don't warn when a variable in a for loop is assigned to but not used. + """ + self.flakes(''' + def f(): + for i in range(10): + pass + ''') + + + def test_assignInListComprehension(self): + """ + Don't warn when a variable in a list comprehension is assigned to but + not used. + """ + self.flakes(''' + def f(): + [None for i in range(10)] + ''') + + + def test_generatorExpression(self): + """ + Don't warn when a variable in a generator expression is assigned to but not used. + """ + self.flakes(''' + def f(): + (None for i in range(10)) + ''') + + + def test_assignmentInsideLoop(self): + """ + Don't warn when a variable assignment occurs lexically after its use. + """ + self.flakes(''' + def f(): + x = None + for i in range(10): + if i > 2: + return x + x = i * 2 + ''') + + + def test_tupleUnpacking(self): + """ + Don't warn when a variable included in tuple unpacking is unused. It's + very common for variables in a tuple unpacking assignment to be unused + in good Python code, so warning will only create false positives. + """ + self.flakes(''' + def f(): + (x, y) = 1, 2 + ''') + + + def test_listUnpacking(self): + """ + Don't warn when a variable included in list unpacking is unused. + """ + self.flakes(''' + def f(): + [x, y] = [1, 2] + ''') + + + def test_closedOver(self): + """ + Don't warn when the assignment is used in an inner function. + """ + self.flakes(''' + def barMaker(): + foo = 5 + def bar(): + return foo + return bar + ''') + + + def test_doubleClosedOver(self): + """ + Don't warn when the assignment is used in an inner function, even if + that inner function itself is in an inner function. + """ + self.flakes(''' + def barMaker(): + foo = 5 + def bar(): + def baz(): + return foo + return bar + ''') + + + +class Python25Test(harness.Test): + """ + Tests for checking of syntax only available in Python 2.5 and newer. + """ + if version_info < (2, 5): + skip = "Python 2.5 required for if-else and with tests" + + def test_ifexp(self): + """ + Test C{foo if bar else baz} statements. + """ + self.flakes("a = 'moo' if True else 'oink'") + self.flakes("a = foo if True else 'oink'", m.UndefinedName) + self.flakes("a = 'moo' if True else bar", m.UndefinedName) + + + def test_withStatementNoNames(self): + """ + No warnings are emitted for using inside or after a nameless C{with} + statement a name defined beforehand. + """ + self.flakes(''' + from __future__ import with_statement + bar = None + with open("foo"): + bar + bar + ''') + + def test_withStatementSingleName(self): + """ + No warnings are emitted for using a name defined by a C{with} statement + within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + bar + bar + ''') + + + def test_withStatementAttributeName(self): + """ + No warnings are emitted for using an attribute as the target of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo.bar: + pass + ''') + + + def test_withStatementSubscript(self): + """ + No warnings are emitted for using a subscript as the target of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo[0]: + pass + ''') + + + def test_withStatementSubscriptUndefined(self): + """ + An undefined name warning is emitted if the subscript used as the + target of a C{with} statement is not defined. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo[bar]: + pass + ''', m.UndefinedName) + + + def test_withStatementTupleNames(self): + """ + No warnings are emitted for using any of the tuple of names defined by + a C{with} statement within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as (bar, baz): + bar, baz + bar, baz + ''') + + + def test_withStatementListNames(self): + """ + No warnings are emitted for using any of the list of names defined by a + C{with} statement within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as [bar, baz]: + bar, baz + bar, baz + ''') + + + def test_withStatementComplicatedTarget(self): + """ + If the target of a C{with} statement uses any or all of the valid forms + for that part of the grammar (See + U{http://docs.python.org/reference/compound_stmts.html#the-with-statement}), + the names involved are checked both for definedness and any bindings + created are respected in the suite of the statement and afterwards. + """ + self.flakes(''' + from __future__ import with_statement + c = d = e = g = h = i = None + with open('foo') as [(a, b), c[d], e.f, g[h:i]]: + a, b, c, d, e, g, h, i + a, b, c, d, e, g, h, i + ''') + + + def test_withStatementSingleNameUndefined(self): + """ + An undefined name warning is emitted if the name first defined by a + C{with} statement is used before the C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + bar + with open('foo') as bar: + pass + ''', m.UndefinedName) + + + def test_withStatementTupleNamesUndefined(self): + """ + An undefined name warning is emitted if a name first defined by a the + tuple-unpacking form of the C{with} statement is used before the + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + baz + with open('foo') as (bar, baz): + pass + ''', m.UndefinedName) + + + def test_withStatementSingleNameRedefined(self): + """ + A redefined name warning is emitted if a name bound by an import is + rebound by the name defined by a C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import bar + with open('foo') as bar: + pass + ''', m.RedefinedWhileUnused) + + + def test_withStatementTupleNamesRedefined(self): + """ + A redefined name warning is emitted if a name bound by an import is + rebound by one of the names defined by the tuple-unpacking form of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import bar + with open('foo') as (bar, baz): + pass + ''', m.RedefinedWhileUnused) + + + def test_withStatementUndefinedInside(self): + """ + An undefined name warning is emitted if a name is used inside the + body of a C{with} statement without first being bound. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + baz + ''', m.UndefinedName) + + + def test_withStatementNameDefinedInBody(self): + """ + A name defined in the body of a C{with} statement can be used after + the body ends without warning. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + baz = 10 + baz + ''') + + + def test_withStatementUndefinedInExpression(self): + """ + An undefined name warning is emitted if a name in the I{test} + expression of a C{with} statement is undefined. + """ + self.flakes(''' + from __future__ import with_statement + with bar as baz: + pass + ''', m.UndefinedName) + + self.flakes(''' + from __future__ import with_statement + with bar as bar: + pass + ''', m.UndefinedName) + + + +class Python27Test(harness.Test): + """ + Tests for checking of syntax only available in Python 2.7 and newer. + """ + if version_info < (2, 7): + skip = "Python 2.7 required for dict/set comprehension tests" + + def test_dictComprehension(self): + """ + Dict comprehensions are properly handled. + """ + self.flakes(''' + a = {1: x for x in range(10)} + ''') + + def test_setComprehensionAndLiteral(self): + """ + Set comprehensions are properly handled. + """ + self.flakes(''' + a = {1, 2, 3} + b = {x for x in range(10)} + ''') diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_script.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_script.py new file mode 100644 index 00000000..233e59ed --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_script.py @@ -0,0 +1,185 @@ + +""" +Tests for L{pyflakes.scripts.pyflakes}. +""" + +import sys +from StringIO import StringIO + +from twisted.python.filepath import FilePath +from twisted.trial.unittest import TestCase + +from pyflakes.scripts.pyflakes import checkPath + +def withStderrTo(stderr, f): + """ + Call C{f} with C{sys.stderr} redirected to C{stderr}. + """ + (outer, sys.stderr) = (sys.stderr, stderr) + try: + return f() + finally: + sys.stderr = outer + + + +class CheckTests(TestCase): + """ + Tests for L{check} and L{checkPath} which check a file for flakes. + """ + def test_missingTrailingNewline(self): + """ + Source which doesn't end with a newline shouldn't cause any + exception to be raised nor an error indicator to be returned by + L{check}. + """ + fName = self.mktemp() + FilePath(fName).setContent("def foo():\n\tpass\n\t") + self.assertFalse(checkPath(fName)) + + + def test_checkPathNonExisting(self): + """ + L{checkPath} handles non-existing files. + """ + err = StringIO() + count = withStderrTo(err, lambda: checkPath('extremo')) + self.assertEquals(err.getvalue(), 'extremo: No such file or directory\n') + self.assertEquals(count, 1) + + + def test_multilineSyntaxError(self): + """ + Source which includes a syntax error which results in the raised + L{SyntaxError.text} containing multiple lines of source are reported + with only the last line of that source. + """ + source = """\ +def foo(): + ''' + +def bar(): + pass + +def baz(): + '''quux''' +""" + + # Sanity check - SyntaxError.text should be multiple lines, if it + # isn't, something this test was unprepared for has happened. + def evaluate(source): + exec source + exc = self.assertRaises(SyntaxError, evaluate, source) + self.assertTrue(exc.text.count('\n') > 1) + + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + + self.assertEqual( + err.getvalue(), + """\ +%s:8: invalid syntax + '''quux''' + ^ +""" % (sourcePath.path,)) + + + def test_eofSyntaxError(self): + """ + The error reported for source files which end prematurely causing a + syntax error reflects the cause for the syntax error. + """ + source = "def foo(" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: unexpected EOF while parsing +def foo( + ^ +""" % (sourcePath.path,)) + + + def test_nonDefaultFollowsDefaultSyntaxError(self): + """ + Source which has a non-default argument following a default argument + should include the line number of the syntax error. However these + exceptions do not include an offset. + """ + source = """\ +def foo(bar=baz, bax): + pass +""" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: non-default argument follows default argument +def foo(bar=baz, bax): +""" % (sourcePath.path,)) + + + def test_nonKeywordAfterKeywordSyntaxError(self): + """ + Source which has a non-keyword argument after a keyword argument should + include the line number of the syntax error. However these exceptions + do not include an offset. + """ + source = """\ +foo(bar=baz, bax) +""" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: non-keyword arg after keyword arg +foo(bar=baz, bax) +""" % (sourcePath.path,)) + + + def test_permissionDenied(self): + """ + If the a source file is not readable, this is reported on standard + error. + """ + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent('') + sourcePath.chmod(0) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEquals(count, 1) + self.assertEquals( + err.getvalue(), "%s: Permission denied\n" % (sourcePath.path,)) + + + def test_misencodedFile(self): + """ + If a source file contains bytes which cannot be decoded, this is + reported on stderr. + """ + source = u"""\ +# coding: ascii +x = "\N{SNOWMAN}" +""".encode('utf-8') + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEquals(count, 1) + self.assertEquals( + err.getvalue(), "%s: problem decoding source\n" % (sourcePath.path,)) diff --git a/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_undefined_names.py b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_undefined_names.py new file mode 100644 index 00000000..309f0b9f --- /dev/null +++ b/ftplugin/python/pyflakes/build/lib.linux-x86_64-2.7/pyflakes/test/test_undefined_names.py @@ -0,0 +1,265 @@ + +from _ast import PyCF_ONLY_AST + +from twisted.trial.unittest import TestCase + +from pyflakes import messages as m, checker +from pyflakes.test import harness + + +class Test(harness.Test): + def test_undefined(self): + self.flakes('bar', m.UndefinedName) + + def test_definedInListComp(self): + self.flakes('[a for a in range(10) if a]') + + + def test_functionsNeedGlobalScope(self): + self.flakes(''' + class a: + def b(): + fu + fu = 1 + ''') + + def test_builtins(self): + self.flakes('range(10)') + + + def test_magicGlobalsFile(self): + """ + Use of the C{__file__} magic global should not emit an undefined name + warning. + """ + self.flakes('__file__') + + + def test_magicGlobalsBuiltins(self): + """ + Use of the C{__builtins__} magic global should not emit an undefined + name warning. + """ + self.flakes('__builtins__') + + + def test_magicGlobalsName(self): + """ + Use of the C{__name__} magic global should not emit an undefined name + warning. + """ + self.flakes('__name__') + + + def test_magicGlobalsPath(self): + """ + Use of the C{__path__} magic global should not emit an undefined name + warning, if you refer to it from a file called __init__.py. + """ + self.flakes('__path__', m.UndefinedName) + self.flakes('__path__', filename='package/__init__.py') + + + def test_globalImportStar(self): + '''Can't find undefined names with import *''' + self.flakes('from fu import *; bar', m.ImportStarUsed) + + def test_localImportStar(self): + '''A local import * still allows undefined names to be found in upper scopes''' + self.flakes(''' + def a(): + from fu import * + bar + ''', m.ImportStarUsed, m.UndefinedName) + + def test_unpackedParameter(self): + '''Unpacked function parameters create bindings''' + self.flakes(''' + def a((bar, baz)): + bar; baz + ''') + + def test_definedByGlobal(self): + '''"global" can make an otherwise undefined name in another function defined''' + self.flakes(''' + def a(): global fu; fu = 1 + def b(): fu + ''') + test_definedByGlobal.todo = '' + + def test_globalInGlobalScope(self): + """ + A global statement in the global scope is ignored. + """ + self.flakes(''' + global x + def foo(): + print x + ''', m.UndefinedName) + + def test_del(self): + '''del deletes bindings''' + self.flakes('a = 1; del a; a', m.UndefinedName) + + def test_delGlobal(self): + '''del a global binding from a function''' + self.flakes(''' + a = 1 + def f(): + global a + del a + a + ''') + + def test_delUndefined(self): + '''del an undefined name''' + self.flakes('del a', m.UndefinedName) + + def test_globalFromNestedScope(self): + '''global names are available from nested scopes''' + self.flakes(''' + a = 1 + def b(): + def c(): + a + ''') + + def test_laterRedefinedGlobalFromNestedScope(self): + """ + Test that referencing a local name that shadows a global, before it is + defined, generates a warning. + """ + self.flakes(''' + a = 1 + def fun(): + a + a = 2 + return a + ''', m.UndefinedLocal) + + def test_laterRedefinedGlobalFromNestedScope2(self): + """ + Test that referencing a local name in a nested scope that shadows a + global declared in an enclosing scope, before it is defined, generates + a warning. + """ + self.flakes(''' + a = 1 + def fun(): + global a + def fun2(): + a + a = 2 + return a + ''', m.UndefinedLocal) + + + def test_intermediateClassScopeIgnored(self): + """ + If a name defined in an enclosing scope is shadowed by a local variable + and the name is used locally before it is bound, an unbound local + warning is emitted, even if there is a class scope between the enclosing + scope and the local scope. + """ + self.flakes(''' + def f(): + x = 1 + class g: + def h(self): + a = x + x = None + print x, a + print x + ''', m.UndefinedLocal) + + + def test_doubleNestingReportsClosestName(self): + """ + Test that referencing a local name in a nested scope that shadows a + variable declared in two different outer scopes before it is defined + in the innermost scope generates an UnboundLocal warning which + refers to the nearest shadowed name. + """ + exc = self.flakes(''' + def a(): + x = 1 + def b(): + x = 2 # line 5 + def c(): + x + x = 3 + return x + return x + return x + ''', m.UndefinedLocal).messages[0] + self.assertEqual(exc.message_args, ('x', 5)) + + + def test_laterRedefinedGlobalFromNestedScope3(self): + """ + Test that referencing a local name in a nested scope that shadows a + global, before it is defined, generates a warning. + """ + self.flakes(''' + def fun(): + a = 1 + def fun2(): + a + a = 1 + return a + return a + ''', m.UndefinedLocal) + + def test_nestedClass(self): + '''nested classes can access enclosing scope''' + self.flakes(''' + def f(foo): + class C: + bar = foo + def f(self): + return foo + return C() + + f(123).f() + ''') + + def test_badNestedClass(self): + '''free variables in nested classes must bind at class creation''' + self.flakes(''' + def f(): + class C: + bar = foo + foo = 456 + return foo + f() + ''', m.UndefinedName) + + def test_definedAsStarArgs(self): + '''star and double-star arg names are defined''' + self.flakes(''' + def f(a, *b, **c): + print a, b, c + ''') + + def test_definedInGenExp(self): + """ + Using the loop variable of a generator expression results in no + warnings. + """ + self.flakes('(a for a in xrange(10) if a)') + + + +class NameTests(TestCase): + """ + Tests for some extra cases of name handling. + """ + def test_impossibleContext(self): + """ + A Name node with an unrecognized context results in a RuntimeError being + raised. + """ + tree = compile("x = 10", "", "exec", PyCF_ONLY_AST) + # Make it into something unrecognizable. + tree.body[0].targets[0].ctx = object() + self.assertRaises(RuntimeError, checker.Checker, tree) diff --git a/ftplugin/python/pyflakes/build/scripts-2.7/pyflakes b/ftplugin/python/pyflakes/build/scripts-2.7/pyflakes new file mode 100755 index 00000000..3f50805a --- /dev/null +++ b/ftplugin/python/pyflakes/build/scripts-2.7/pyflakes @@ -0,0 +1,4 @@ +#!/usr/bin/python + +from pyflakes.scripts.pyflakes import main +main() diff --git a/ftplugin/python/pyflakes/pyflakes/__init__.py b/ftplugin/python/pyflakes/pyflakes/__init__.py new file mode 100644 index 00000000..652a8f47 --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/__init__.py @@ -0,0 +1,2 @@ + +__version__ = '0.4.0' diff --git a/ftplugin/python/pyflakes/pyflakes/__init__.pyc b/ftplugin/python/pyflakes/pyflakes/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baef25e7a816aaba15ea16b8a3481915f49b533c GIT binary patch literal 182 zcmZSn%*!<+`-@L90~9aol8k&1 nm6ns3omz}w#K&jmWtPOp>j7180L`$;%}*)KNwovJ0b~aNj2tOg literal 0 HcmV?d00001 diff --git a/ftplugin/python/pyflakes/pyflakes/checker.py b/ftplugin/python/pyflakes/pyflakes/checker.py new file mode 100644 index 00000000..7c348b8d --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/checker.py @@ -0,0 +1,625 @@ +# -*- test-case-name: pyflakes -*- +# (c) 2005-2010 Divmod, Inc. +# See LICENSE file for details + +import __builtin__ +import os.path +import _ast + +from pyflakes import messages + + +# utility function to iterate over an AST node's children, adapted +# from Python 2.6's standard ast module +try: + import ast + iter_child_nodes = ast.iter_child_nodes +except (ImportError, AttributeError): + def iter_child_nodes(node, astcls=_ast.AST): + """ + Yield all direct child nodes of *node*, that is, all fields that are nodes + and all items of fields that are lists of nodes. + """ + for name in node._fields: + field = getattr(node, name, None) + if isinstance(field, astcls): + yield field + elif isinstance(field, list): + for item in field: + yield item + + +class Binding(object): + """ + Represents the binding of a value to a name. + + The checker uses this to keep track of which names have been bound and + which names have not. See L{Assignment} for a special type of binding that + is checked with stricter rules. + + @ivar used: pair of (L{Scope}, line-number) indicating the scope and + line number that this binding was last used + """ + + def __init__(self, name, source): + self.name = name + self.source = source + self.used = False + + + def __str__(self): + return self.name + + + def __repr__(self): + return '<%s object %r from line %r at 0x%x>' % (self.__class__.__name__, + self.name, + self.source.lineno, + id(self)) + + + +class UnBinding(Binding): + '''Created by the 'del' operator.''' + + + +class Importation(Binding): + """ + A binding created by an import statement. + + @ivar fullName: The complete name given to the import statement, + possibly including multiple dotted components. + @type fullName: C{str} + """ + def __init__(self, name, source): + self.fullName = name + name = name.split('.')[0] + super(Importation, self).__init__(name, source) + + + +class Argument(Binding): + """ + Represents binding a name as an argument. + """ + + + +class Assignment(Binding): + """ + Represents binding a name with an explicit assignment. + + The checker will raise warnings for any Assignment that isn't used. Also, + the checker does not consider assignments in tuple/list unpacking to be + Assignments, rather it treats them as simple Bindings. + """ + + + +class FunctionDefinition(Binding): + pass + + + +class ExportBinding(Binding): + """ + A binding created by an C{__all__} assignment. If the names in the list + can be determined statically, they will be treated as names for export and + additional checking applied to them. + + The only C{__all__} assignment that can be recognized is one which takes + the value of a literal list containing literal strings. For example:: + + __all__ = ["foo", "bar"] + + Names which are imported and not otherwise used but appear in the value of + C{__all__} will not have an unused import warning reported for them. + """ + def names(self): + """ + Return a list of the names referenced by this binding. + """ + names = [] + if isinstance(self.source, _ast.List): + for node in self.source.elts: + if isinstance(node, _ast.Str): + names.append(node.s) + return names + + + +class Scope(dict): + importStarred = False # set to True when import * is found + + + def __repr__(self): + return '<%s at 0x%x %s>' % (self.__class__.__name__, id(self), dict.__repr__(self)) + + + def __init__(self): + super(Scope, self).__init__() + + + +class ClassScope(Scope): + pass + + + +class FunctionScope(Scope): + """ + I represent a name scope for a function. + + @ivar globals: Names declared 'global' in this function. + """ + def __init__(self): + super(FunctionScope, self).__init__() + self.globals = {} + + + +class ModuleScope(Scope): + pass + + +# Globally defined names which are not attributes of the __builtin__ module. +_MAGIC_GLOBALS = ['__file__', '__builtins__'] + + + +class Checker(object): + """ + I check the cleanliness and sanity of Python code. + + @ivar _deferredFunctions: Tracking list used by L{deferFunction}. Elements + of the list are two-tuples. The first element is the callable passed + to L{deferFunction}. The second element is a copy of the scope stack + at the time L{deferFunction} was called. + + @ivar _deferredAssignments: Similar to C{_deferredFunctions}, but for + callables which are deferred assignment checks. + """ + + nodeDepth = 0 + traceTree = False + + def __init__(self, tree, filename='(none)'): + self._deferredFunctions = [] + self._deferredAssignments = [] + self.dead_scopes = [] + self.messages = [] + self.filename = filename + self.scopeStack = [ModuleScope()] + self.futuresAllowed = True + self.handleChildren(tree) + self._runDeferred(self._deferredFunctions) + # Set _deferredFunctions to None so that deferFunction will fail + # noisily if called after we've run through the deferred functions. + self._deferredFunctions = None + self._runDeferred(self._deferredAssignments) + # Set _deferredAssignments to None so that deferAssignment will fail + # noisly if called after we've run through the deferred assignments. + self._deferredAssignments = None + del self.scopeStack[1:] + self.popScope() + self.check_dead_scopes() + + + def deferFunction(self, callable): + ''' + Schedule a function handler to be called just before completion. + + This is used for handling function bodies, which must be deferred + because code later in the file might modify the global scope. When + `callable` is called, the scope at the time this is called will be + restored, however it will contain any new bindings added to it. + ''' + self._deferredFunctions.append((callable, self.scopeStack[:])) + + + def deferAssignment(self, callable): + """ + Schedule an assignment handler to be called just after deferred + function handlers. + """ + self._deferredAssignments.append((callable, self.scopeStack[:])) + + + def _runDeferred(self, deferred): + """ + Run the callables in C{deferred} using their associated scope stack. + """ + for handler, scope in deferred: + self.scopeStack = scope + handler() + + + def scope(self): + return self.scopeStack[-1] + scope = property(scope) + + def popScope(self): + self.dead_scopes.append(self.scopeStack.pop()) + + + def check_dead_scopes(self): + """ + Look at scopes which have been fully examined and report names in them + which were imported but unused. + """ + for scope in self.dead_scopes: + export = isinstance(scope.get('__all__'), ExportBinding) + if export: + all = scope['__all__'].names() + if os.path.split(self.filename)[1] != '__init__.py': + # Look for possible mistakes in the export list + undefined = set(all) - set(scope) + for name in undefined: + self.report( + messages.UndefinedExport, + scope['__all__'].source, + name) + else: + all = [] + + # Look for imported names that aren't used. + for importation in scope.itervalues(): + if isinstance(importation, Importation): + if not importation.used and importation.name not in all: + self.report( + messages.UnusedImport, + importation.source, + importation.name) + + + def pushFunctionScope(self): + self.scopeStack.append(FunctionScope()) + + def pushClassScope(self): + self.scopeStack.append(ClassScope()) + + def report(self, messageClass, *args, **kwargs): + self.messages.append(messageClass(self.filename, *args, **kwargs)) + + def handleChildren(self, tree): + for node in iter_child_nodes(tree): + self.handleNode(node, tree) + + def isDocstring(self, node): + """ + Determine if the given node is a docstring, as long as it is at the + correct place in the node tree. + """ + return isinstance(node, _ast.Str) or \ + (isinstance(node, _ast.Expr) and + isinstance(node.value, _ast.Str)) + + def handleNode(self, node, parent): + node.parent = parent + if self.traceTree: + print ' ' * self.nodeDepth + node.__class__.__name__ + self.nodeDepth += 1 + if self.futuresAllowed and not \ + (isinstance(node, _ast.ImportFrom) or self.isDocstring(node)): + self.futuresAllowed = False + nodeType = node.__class__.__name__.upper() + try: + handler = getattr(self, nodeType) + handler(node) + finally: + self.nodeDepth -= 1 + if self.traceTree: + print ' ' * self.nodeDepth + 'end ' + node.__class__.__name__ + + def ignore(self, node): + pass + + # "stmt" type nodes + RETURN = DELETE = PRINT = WHILE = IF = WITH = RAISE = TRYEXCEPT = \ + TRYFINALLY = ASSERT = EXEC = EXPR = handleChildren + + CONTINUE = BREAK = PASS = ignore + + # "expr" type nodes + BOOLOP = BINOP = UNARYOP = IFEXP = DICT = SET = YIELD = COMPARE = \ + CALL = REPR = ATTRIBUTE = SUBSCRIPT = LIST = TUPLE = handleChildren + + NUM = STR = ELLIPSIS = ignore + + # "slice" type nodes + SLICE = EXTSLICE = INDEX = handleChildren + + # expression contexts are node instances too, though being constants + LOAD = STORE = DEL = AUGLOAD = AUGSTORE = PARAM = ignore + + # same for operators + AND = OR = ADD = SUB = MULT = DIV = MOD = POW = LSHIFT = RSHIFT = \ + BITOR = BITXOR = BITAND = FLOORDIV = INVERT = NOT = UADD = USUB = \ + EQ = NOTEQ = LT = LTE = GT = GTE = IS = ISNOT = IN = NOTIN = ignore + + # additional node types + COMPREHENSION = EXCEPTHANDLER = KEYWORD = handleChildren + + def addBinding(self, loc, value, reportRedef=True): + '''Called when a binding is altered. + + - `loc` is the location (an object with lineno and optionally + col_offset attributes) of the statement responsible for the change + - `value` is the optional new value, a Binding instance, associated + with the binding; if None, the binding is deleted if it exists. + - if `reportRedef` is True (default), rebinding while unused will be + reported. + ''' + if (isinstance(self.scope.get(value.name), FunctionDefinition) + and isinstance(value, FunctionDefinition)): + self.report(messages.RedefinedFunction, + loc, value.name, self.scope[value.name].source) + + if not isinstance(self.scope, ClassScope): + for scope in self.scopeStack[::-1]: + existing = scope.get(value.name) + if (isinstance(existing, Importation) + and not existing.used + and (not isinstance(value, Importation) or value.fullName == existing.fullName) + and reportRedef): + + self.report(messages.RedefinedWhileUnused, + loc, value.name, scope[value.name].source) + + if isinstance(value, UnBinding): + try: + del self.scope[value.name] + except KeyError: + self.report(messages.UndefinedName, loc, value.name) + else: + self.scope[value.name] = value + + def GLOBAL(self, node): + """ + Keep track of globals declarations. + """ + if isinstance(self.scope, FunctionScope): + self.scope.globals.update(dict.fromkeys(node.names)) + + def LISTCOMP(self, node): + # handle generators before element + for gen in node.generators: + self.handleNode(gen, node) + self.handleNode(node.elt, node) + + GENERATOREXP = SETCOMP = LISTCOMP + + # dictionary comprehensions; introduced in Python 2.7 + def DICTCOMP(self, node): + for gen in node.generators: + self.handleNode(gen, node) + self.handleNode(node.key, node) + self.handleNode(node.value, node) + + def FOR(self, node): + """ + Process bindings for loop variables. + """ + vars = [] + def collectLoopVars(n): + if isinstance(n, _ast.Name): + vars.append(n.id) + elif isinstance(n, _ast.expr_context): + return + else: + for c in iter_child_nodes(n): + collectLoopVars(c) + + collectLoopVars(node.target) + for varn in vars: + if (isinstance(self.scope.get(varn), Importation) + # unused ones will get an unused import warning + and self.scope[varn].used): + self.report(messages.ImportShadowedByLoopVar, + node, varn, self.scope[varn].source) + + self.handleChildren(node) + + def NAME(self, node): + """ + Handle occurrence of Name (which can be a load/store/delete access.) + """ + # Locate the name in locals / function / globals scopes. + if isinstance(node.ctx, (_ast.Load, _ast.AugLoad)): + # try local scope + importStarred = self.scope.importStarred + try: + self.scope[node.id].used = (self.scope, node) + except KeyError: + pass + else: + return + + # try enclosing function scopes + + for scope in self.scopeStack[-2:0:-1]: + importStarred = importStarred or scope.importStarred + if not isinstance(scope, FunctionScope): + continue + try: + scope[node.id].used = (self.scope, node) + except KeyError: + pass + else: + return + + # try global scope + + importStarred = importStarred or self.scopeStack[0].importStarred + try: + self.scopeStack[0][node.id].used = (self.scope, node) + except KeyError: + if ((not hasattr(__builtin__, node.id)) + and node.id not in _MAGIC_GLOBALS + and not importStarred): + if (os.path.basename(self.filename) == '__init__.py' and + node.id == '__path__'): + # the special name __path__ is valid only in packages + pass + else: + self.report(messages.UndefinedName, node, node.id) + elif isinstance(node.ctx, (_ast.Store, _ast.AugStore)): + # if the name hasn't already been defined in the current scope + if isinstance(self.scope, FunctionScope) and node.id not in self.scope: + # for each function or module scope above us + for scope in self.scopeStack[:-1]: + if not isinstance(scope, (FunctionScope, ModuleScope)): + continue + # if the name was defined in that scope, and the name has + # been accessed already in the current scope, and hasn't + # been declared global + if (node.id in scope + and scope[node.id].used + and scope[node.id].used[0] is self.scope + and node.id not in self.scope.globals): + # then it's probably a mistake + self.report(messages.UndefinedLocal, + scope[node.id].used[1], + node.id, + scope[node.id].source) + break + + if isinstance(node.parent, + (_ast.For, _ast.comprehension, _ast.Tuple, _ast.List)): + binding = Binding(node.id, node) + elif (node.id == '__all__' and + isinstance(self.scope, ModuleScope)): + binding = ExportBinding(node.id, node.parent.value) + else: + binding = Assignment(node.id, node) + if node.id in self.scope: + binding.used = self.scope[node.id].used + self.addBinding(node, binding) + elif isinstance(node.ctx, _ast.Del): + if isinstance(self.scope, FunctionScope) and \ + node.id in self.scope.globals: + del self.scope.globals[node.id] + else: + self.addBinding(node, UnBinding(node.id, node)) + else: + # must be a Param context -- this only happens for names in function + # arguments, but these aren't dispatched through here + raise RuntimeError( + "Got impossible expression context: %r" % (node.ctx,)) + + + def FUNCTIONDEF(self, node): + # the decorators attribute is called decorator_list as of Python 2.6 + if hasattr(node, 'decorators'): + for deco in node.decorators: + self.handleNode(deco, node) + else: + for deco in node.decorator_list: + self.handleNode(deco, node) + self.addBinding(node, FunctionDefinition(node.name, node)) + self.LAMBDA(node) + + def LAMBDA(self, node): + for default in node.args.defaults: + self.handleNode(default, node) + + def runFunction(): + args = [] + + def addArgs(arglist): + for arg in arglist: + if isinstance(arg, _ast.Tuple): + addArgs(arg.elts) + else: + if arg.id in args: + self.report(messages.DuplicateArgument, + node, arg.id) + args.append(arg.id) + + self.pushFunctionScope() + addArgs(node.args.args) + # vararg/kwarg identifiers are not Name nodes + if node.args.vararg: + args.append(node.args.vararg) + if node.args.kwarg: + args.append(node.args.kwarg) + for name in args: + self.addBinding(node, Argument(name, node), reportRedef=False) + if isinstance(node.body, list): + # case for FunctionDefs + for stmt in node.body: + self.handleNode(stmt, node) + else: + # case for Lambdas + self.handleNode(node.body, node) + def checkUnusedAssignments(): + """ + Check to see if any assignments have not been used. + """ + for name, binding in self.scope.iteritems(): + if (not binding.used and not name in self.scope.globals + and isinstance(binding, Assignment)): + self.report(messages.UnusedVariable, + binding.source, name) + self.deferAssignment(checkUnusedAssignments) + self.popScope() + + self.deferFunction(runFunction) + + + def CLASSDEF(self, node): + """ + Check names used in a class definition, including its decorators, base + classes, and the body of its definition. Additionally, add its name to + the current scope. + """ + # decorator_list is present as of Python 2.6 + for deco in getattr(node, 'decorator_list', []): + self.handleNode(deco, node) + for baseNode in node.bases: + self.handleNode(baseNode, node) + self.pushClassScope() + for stmt in node.body: + self.handleNode(stmt, node) + self.popScope() + self.addBinding(node, Binding(node.name, node)) + + def ASSIGN(self, node): + self.handleNode(node.value, node) + for target in node.targets: + self.handleNode(target, node) + + def AUGASSIGN(self, node): + # AugAssign is awkward: must set the context explicitly and visit twice, + # once with AugLoad context, once with AugStore context + node.target.ctx = _ast.AugLoad() + self.handleNode(node.target, node) + self.handleNode(node.value, node) + node.target.ctx = _ast.AugStore() + self.handleNode(node.target, node) + + def IMPORT(self, node): + for alias in node.names: + name = alias.asname or alias.name + importation = Importation(name, node) + self.addBinding(node, importation) + + def IMPORTFROM(self, node): + if node.module == '__future__': + if not self.futuresAllowed: + self.report(messages.LateFutureImport, node, + [n.name for n in node.names]) + else: + self.futuresAllowed = False + + for alias in node.names: + if alias.name == '*': + self.scope.importStarred = True + self.report(messages.ImportStarUsed, node, node.module) + continue + name = alias.asname or alias.name + importation = Importation(name, node) + if node.module == '__future__': + importation.used = (self.scope, node) + self.addBinding(node, importation) diff --git a/ftplugin/python/pyflakes/pyflakes/checker.pyc b/ftplugin/python/pyflakes/pyflakes/checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18b94b70e897d75cb226e725fd6c1c9079c1af89 GIT binary patch literal 22704 zcmc&+TW}lKc|Hq(lt@t`Mak4%Uh85(vP{{DVq}?))ampg51BsYwVr7@ee31>{(mnZ zCD&~RN-3VBvuDrsKmYwd%k(ey_kL&X-zF<2{OQL3FC+QCV;SS(*D^I@igDR8#Z*+E zHpR4*Q>Ks_YUWvuOE(d%wg>^5GvS>0obd(3?ONt5yR8n4GJrOaBdX>A(Ivb?le z?KN)NyoZtZn7UgK_PkaR-feNY-#Du03qr!^S%-wU5QMj~RC; zsy!0d4jK1oRC_G0J!0JB#yw${Q>J*-xF@6CpNd-mq?Vb?gaQr&B|hWKWDVV}95F>hzsX3ET?9e(F!ZJgf!09mgc{@kg0HP~3DG z`hmQVS%%||g)Bi6>_Jx2K2l!xf^rbFuuWqMjk*`~qEPj#bw4QAE1uMINbSv595*11 zl>MMm^QA?-yzT`YUq+THE-;H4BbomaN>^4I>)w_1^7GGLeeTNe8`bqIOF^@?xm>MZ zX>JEA4gR-OE3bKeQmCwWl{K$5j0OW30;9G{0>zT-ZxD6<0c56Yz#6prt-VP5E!o;= zweD8y%Q0OOVMf{hA~FvY4e~-Rm;fRpA*YCM#f%Um3SGvT$#T#BTj(sHbi8KE^SwG? z9ISZuqRzp?EZc9CYnz@OG*Bc!hI^&QESiP8us3}ie6UhQ*09$+uW1LZa%GL(@2ylT zE7H%mSITc-XwR$Li;Yblc-@tu9%xf<1jF`>=h>5Qjre|bxxS8--M5z-Ev&(BdX;Lq zW(V6%k26GTCAP_MScWdlweMAf726M5)d~P?w>E2@A1?pp>Ko-27w%rOo8@YYBV{Mw znyECJ-u=sVty=eL1Gr$vWFvA^06}%%_|kYkB3s zbM3`#q2>#&SG!=EqhIEJO{5KQd0f_*6G*PD$N#8$OY zui#OBxav_PpU`dJ5wKL5JGMq7@&6u~FqM&*BUX}~mg{y^h6gvq?#WMgFv6wHTCD&) zyk-kuZ>%?KUI1Q(Dto#523R&YJ0-*JQ7+4zWPZ&CSoLCU8|<=D+oXuH*EefH6(iYh zBOu5t7#G4AQbq;%%fiExxyRlDiQeDI8q?U9(B|h*NLZs~K%Uffkf+SC`@$rt@_;^5 zq*XRev23{p8Wx8sKuI!YnCg>J!B2dTrWfYvH*3{EOPfFm=L8xEjw@b}GbMzY;6*18 zos{$nQp`IKS<2)|f(bI}YEadNmYtZMI~6!nG3ed{oFs5YTFaY6mI})96C>ouk=Uov zOir*(rHCY;DiAj0An>sq4y~y0E229at8(9ZhSDIZGg8Rh z1{5-g4^Uj)ue#8ElF5A#s2yyAEU!=lwm0id=xURIM6cAUW1$5t9ZJXwtw+)RNc#1ZH3TOZ{(6OkT1J$vs zST!!YuABmtbwNzxSh)#mKtB~H>ur?Ks6%!0)`IRUXxvt9)dEE11pK@X&!*u0GkQfLYYW??V4IS6l@_N?HBDYompx$ z&Rn+7ES6hm7PJMWrXQ|>cC89XLIxHNNw7icxktjLK5j2=0zl2C2kV1$*tS+#d>a4+ z)Eq(VCLGOXT}B8+aL6WXsBZu|M&=1%JiwHz7QLHNkNjL1`|Bty8$(g43b@EjXts0^ z6wTIk(R(3SGw=sIB~AsgL7;@Lc1fcwrRr)o1uI-X5WUt$*5G%(E}}V9vTkA?Spt{g zc)?~1%wEBd1L2MpV_M#l*YaSEhq@S!GZYkwd7s^j!5nTutQIk3O0c1%FbTYsf>#TC z$bQIqnEYbH1Hg4x#J!(LZjtLUx5GvWsds|PFJZ)cNIn%-lj*h|vkt*@KmKqb&eqBN zQtHGa&SF@qH@*n*{Se}`2*s$apddf71h?_1tk8phN{q|*)J>qerML;GTM8<%8wVRh z@}ET3ZYQaM3WUHZQ1?k{N^+Vowga^$IA`ar zK^gmf487Y7BnHX$$bLa1>QkdS2}KfikxNCAYbq#C(O7q$Vn*HV5gBPR_HSYQaJ7k9 zraB?@uz(^(*}_avZnZpD_V}n&MQ$0GqMB;A)t!bxM*rFv&DxJaw!L`&E0(*%nDU!k zCUF>~Kp;gb!pE%g6Xk9bV+e1{lkcj_%nsFB^$V$!YAIAjb{JX9wZ zovtGKT*lOCTtQKO*l`rezk`wz7g&^fe!8yCw{bJ#G}sfyUy6Gfdm+#7 zF|Nd3iU_alGhQ!cJIaW`@GU|#5`!rsD$^@92*gPIr6{o%wn4Z>VlPERSPn=V1XU#N zQar?%3)>)?a?oUok0A{q9YH#ZbPVY@(g~!KNT-laBRy`4He)K8;uA<`O!2JtKZmFD zNQgQWFCb-+E+Sn*dJ5?>($h%8NLP@aF~w(foKNBD)28^Gj`JBjJ#UIv_1$Oj^f{z! zNG~8=H^mqA%}aRtJkrZZBS@o2V@TsjIiv}s8%Q^i@5E7X z(hSlp(j3yONb^XyP4SMdtca&Cnc{24TQDxdR5*;+8KNQ(OU9KDRq?Lz?xJ1U6c-t& z;=77*B~Vp#8Kh#3XIu$V6_*&GV$HH~B|ueNVQ`8yRfecoSY?Qcg*D?!h^kmKu#)IB z^M3{g6f!>1v$RxyiSrY1HmM^z&Rz99OF4lQV|uq?obPy@Pv=r^T|RHa`nRbE(?Gke>FV zy+G}g=1h4JhHDez%F_@8M}tZ7kV!d=51RwqYa6GGtu%gM_NGZs;r6fI@{Xx0?xU#3B$+pM{2dk zJ2aHFRx~k#p2`Pyq%`y~; zUon@dkjXG)F_C742&7x};M~&Khelp zBQR23(rAKea>@{f?fDh29uIXlqRP8mnr=m$Dk1x5XBZMUj9W!cmv|`P6=D^hd)ZzA za=oF>IdK<+{ta;BZM*K>iwtV8XV-W*TU=;8wGh`;{>=2Hu&=a)yP8U~3sm!K2e53%d@f552n5|8%*6o^qK#Kn+bw!x2~ zvxmXY8NrLr!i{#ctT5qLKSPy5u1g?Co)8lvO|`9aB*F28ljgM)y*juX!iyoo#u*}k zWxIh}JPB34icT>YolW&pMR*`y!!Z@kK*9SUG7=VK9fIh9a|6M7dZXH8Vmrc-Co7t9 zonqVznnhq2MK^@B#$gz3?V)LCWEpt0OnX2?3Ft@ zYBLF`$Zk3wu68Cc_rGuvT#b3i;!dGD;jiGb@KL~z7faB{O(8J8ipB|gik}Pu=22OG zjB5TXQv2FzyodqAdWKH6`bF;Z_EN^8LsFy!b^%yJLST*Xx&T#yo~<7cdwB+MEMbSd z+0;cRBs`D=!CrP?2+&QNwX|vdm_c^nH;0LojH9^Qv^C7@P2&q^&3%dDL+OB+hx!nW zzTdnJFJ~IW@Fp%m{n*sI#ao&-Td%Xt>H*F^zA$a>LzTgLk@t&N^d~H@4w$}Huf@_q zPQSLt@DU5tc?P8s=8y(5O|P}_6N6vgwwiY{kcsrK`M-`VroPEWV~tKT)k8vQmE5CY z>~b4!_p*BHse`LKICQb9tXhwUQ)zb(Zr8+5P32KN%L$zd6^4FqQKN($q8lE#wN%K8 z<4#aZl#n!5jZ0U~S^V$NyD3)}8hVeai3pNIoj~*y!9ZM55l^iyR~0NWx4Akv0YeWO zAyKa{olErMi&x**pe!3pC|2~SIdP5WCB&U2stIQiLXv4TG9fcV?Uw5UxPhcI=_sUk zb)iWFzOx+X^BDZ!k;HMzJ6%U{#bUsEJT(MW3LZ2lQ3q4q=|fPij>&WPLx`TvshH>i zUZ5k8`~j~d8IzJb{UDEs%tbS8Zu%>c{1$!nFi5+d?sqWM|MT+czk5{6r-shuCoan) zZEGjnC03Ijr;y~1PYil61D1t5fzolE_F>0>Zs9SAZk|Xxs{P^JPMKZI1_Z->LDV&b zb(a0kV&5&yczoCPNUvPe7?K}q2@DI#X2utWg!^Kb*ef=QT3n>q*bhFH_`nGzhh!sm zkjm@=4F1GEab9MVZe*R^&~=P>iW}k%=v|CeMxK~#iJVFI171!4eabYSZ>tdr(}-#y zTHynuVmlQj^eQ@ z4fsEBQLI@jSI}FvD;bHFT*8AjJ|cK?4r_5Pa7TOuXKaaTBuxLKDL84CTBxtc18 z*8qXW)&{RMq9ue7r8^F;EMrB|ypJu!Wl-ue93>ibbzi6;ym`t%Dqw!<0Z=65W;2l( z?2;IaH{raW<-E7UmHxDCrO+mh!~^SU(NV9>7KF#ywn|1G34)DwmhlCl;U;`h^+1FS z@4wrl89b_7U%(qf3=jz_nr6$S-igoXS`gu7cQ04lL-}z)La-K~!bvRHK1qR{OuK@Tl@qa?4#pS|sUYZqGbfd}pKbT@WX1ur)(WsRgOH0r_!IW|B1FEm*UyR(y@ZajqNa)Z$?kVy% zBV5ROs{+2#a(y}B;#iWf-*{2cgyMFQR}cl!-6*hmjE<`g6c3S!+_o@TJ+~HKfOvs& zhTkoygD9*eaBy1{vIuuymMC4kEnImhz2a@>S}k09A;*mk1_o6%I8LS_sy-0K zd5sU$Qre)Rb^#YG0EGXdv+RdV91gcp{fgo?SW57gz@vQKdP0;0n(q%+Y+-y6$JQOs;^`kbOmn)NMH0>-}5yF%Cnc1BEr~z{6)H|M$OxY}uHv8}l{% z;=2v;Fntv@mU$l%3#Y9{^j68dPxNT}mJZUG!X4xm>jRgC=%A>=-9$}QpCz&dxsTEC zg1`$~K<+~o*tl%)EBFPaRh3YP{!kLqcN|mZbgNNeEHz}$dIPxDXf$!3u~lWvvW+w= z*nS*!p+4!~MW%crHfCDqxvx-3ffhr?aJ8+G-s^iol(VhVqIe5H#uo;7QBYyTUK=-e z*nZ+-5llG8Nm(NQRlma!tEgnb>w?ePaOKk53dB+rmVm`UPnEo)73_{3`f#Wr-qk={ zv=YGc)qE9oSyY)$1hn45I3EyYxH1Fw%jo6(d&Y7REQ6ShBGRv{K2I2&hD| z(VL-q`pin%Wr%NdJ6y8Lx9e!Iiyj0_*k{NV$f}$-nQ>_y*rITqi7DqB+$BXcuOSZh z?1xx60WQ&JomSyOlZ{&z{`d7NxN9kxUe?WB?C=HE68vrtWt?yd;fZ#6Oy?E4GpfTLR^aEqqK@uIlccxrn9?zHe_Ysy zsja_>wwN*Y_`;9GiynbFI2sP-52Q9eqT&z^055j8X?s}hy2;}_+hjCcI|@PGR((SF<}}uV-^eh*uqS2funS&bW1 z^z#7R=!fFSB(sl>kSk17(vM8_)|v1B5zl7K5$sH!LSkF&xCWVbVn*Gp3@Ngm_|iE7duJ~m?}VcgbKgosmzddx&<>+rHe%Y(s8 zV92<${Eo*V(Bwl&4Zpm`$0wN8kO_Fky_(uj6n+Tl@>-JEP`e#T0wjt)0Z6Ebhzypj z6He$1~|f zVdm+GAcTe(QYQo!=%@9(*}56hPMh5zx*aHr6t-~;67O83X7kS|#OB40W-qJy2hR&c ztjbIAaE63RB31?iMa!j^k*YyK>8FL79oO(R_9RT zeBr!7eBpge)x}OYB;WuF*dY`oklwo~Xff}ad9Vx)+C#@MUbcR2wyuUX0w63AgX|+> zX?JVm?|_qs!fNdszQK0+r&rS4C{#Iigp*wC8;cKZ_vd&jg$lVcF_9!9(4#%KwZ^rM zFI1uriGb2_MqJ(%j!JQ(CxL4ve8_NZ6k&iH9@S;Ihk($xbQy-w6DtZG2vE6{l7yRj zFnQuAcYd3XPcjpho@nOuIgNuY@=rE+BjHD;VwhyP8R2VC^GPeh8d28E=|mC@8{dxG zxh_WNoDK5(7#f_Bn5m z`S`;eRs3NPTro@TRfT`ugP*I(U-;nFyTol6jZqM_L)~vYPX_go)_oPp^egERi}Xs) zR3#+Ggh?odut-QbP<1?h16{L3SUJHg3LUYih+A?2Q+<%httr_xDPIi(c{CZ z!HX4C#D8UpaQAz62g_}tuk<`bK zd^)Fjv?>Y3`sa!6#3Xf3pa}{gww>DHjN_2XFkVAR=m=i{!jaYX?W-~g%+=wolgDA> z`5T2vZk&%KsR7mSq7BPt%XkHK9}3mGy5AJPRpa&r>8a-F_L3^ml?f5{>;9yEZlWwu zeu_QlU@qfu-_DnrQEL`owexk9lz+x7sIyo>{2iIQq0spvp(ElVP0u5JkAe=wY9@hD z9)+z@(TXVMuZCA30kP)eJbr*^*B^EZ8HWHcbTY_o!UPf`O)g{J#n5iTby+%h1 zaTm#moGRCESn&8j$Vi*`CHRd&MZDwi}FKM+48#=(ar z&{Z+ZhvXU@zsHpH`xKo>bZuRa=uUUV(IdKa^DiPNCax2~QyB4bUN~*vz|X^RQAyup zmnj{HyhZ(Ni5lYk#@&$0(|~|lgZMsBJ}ZGwg1XM7EKyeuR{uDYLxz(0ALMV#O+pQx zkY4Jqme`!0tSBGX*kytlZGZ7~gpO@6kvXVb&Y$sR;sh6z;qj=lETt_z{y8&2ts;!kM~tmuPbuRR)R|KS_Bq)dSUoN*M1?@-OD~!_?2Nb47=l9c6Zm*h&N&4+n(^FZ zZZ;=WHSOdJvr?MBnV-zTg^68Fh)y@3pS>w>oRR!YPOb~hI(Krn$8yuN;t9ahM7}UG zIeAA$1zX8Ev(hzpJ2w^GrbPE9!+k`$CL zyvpMgNK7e^=C}?*YYxDZ_2s@Odn`=NqD0&Y*EIb}X5V7=17<&D_9JFLX7-oJ5+Ng{PU!m2VOX*+e;Qf$zU~w*Tc`Sl zdir|y_Vo0m`cgfap3^;P`IkY>!Je*9r4D4Sr4FPIq>p#C(g#v~XL|PZboZw5cju1w z-0s=e^9);|ZFlxK26euIO!nRIhvlOC7g&3awLInMZ+|){t1lLRzC^Fh(za4otJhh` zlt!X^Nm@mG7y+#iMf9eV`gvt$VaYb$sI&JBOJ|u~X7&`bVPL1!Ov=9HE7}}4#Z>Xy;^WP)p4wnD` literal 0 HcmV?d00001 diff --git a/ftplugin/python/pyflakes/pyflakes/messages.py b/ftplugin/python/pyflakes/pyflakes/messages.py new file mode 100644 index 00000000..73bf4cc3 --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/messages.py @@ -0,0 +1,96 @@ +# (c) 2005 Divmod, Inc. See LICENSE file for details + +class Message(object): + message = '' + message_args = () + def __init__(self, filename, loc, use_column=True): + self.filename = filename + self.lineno = loc.lineno + self.col = getattr(loc, 'col_offset', None) if use_column else None + + def __str__(self): + return '%s:%s: %s' % (self.filename, self.lineno, self.message % self.message_args) + + +class UnusedImport(Message): + message = '%r imported but unused' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc, use_column=False) + self.message_args = (name,) + + +class RedefinedWhileUnused(Message): + message = 'redefinition of unused %r from line %r' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class ImportShadowedByLoopVar(Message): + message = 'import %r from line %r shadowed by loop variable' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class ImportStarUsed(Message): + message = "'from %s import *' used; unable to detect undefined names" + def __init__(self, filename, loc, modname): + Message.__init__(self, filename, loc) + self.message_args = (modname,) + + +class UndefinedName(Message): + message = 'undefined name %r' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + + +class UndefinedExport(Message): + message = 'undefined name %r in __all__' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + + +class UndefinedLocal(Message): + message = "local variable %r (defined in enclosing scope on line %r) referenced before assignment" + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class DuplicateArgument(Message): + message = 'duplicate argument %r in function definition' + def __init__(self, filename, loc, name): + Message.__init__(self, filename, loc) + self.message_args = (name,) + + +class RedefinedFunction(Message): + message = 'redefinition of function %r from line %r' + def __init__(self, filename, loc, name, orig_loc): + Message.__init__(self, filename, loc) + self.message_args = (name, orig_loc.lineno) + + +class LateFutureImport(Message): + message = 'future import(s) %r after other statements' + def __init__(self, filename, loc, names): + Message.__init__(self, filename, loc) + self.message_args = (names,) + + +class UnusedVariable(Message): + """ + Indicates that a variable has been explicity assigned to but not actually + used. + """ + + message = 'local variable %r is assigned to but never used' + def __init__(self, filename, loc, names): + Message.__init__(self, filename, loc) + self.message_args = (names,) diff --git a/ftplugin/python/pyflakes/pyflakes/messages.pyc b/ftplugin/python/pyflakes/pyflakes/messages.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89eeedf139096e274416cb419cd584e9a7f08d0e GIT binary patch literal 6462 zcmds5Yj4y>6dh-i&4ciU0DTT>Qx;lCtG-m|6DSgD8dXjKHBxIi_ITsqwIk0gB@*B0 zkLdqwe?ZTgf@G_;0C)Q4Dol^01W1VTO9Tj&Q>uhVCR`Fb8oo}r(Dqd);M_OxF z#fy#gXltES@v+8wytU4$_(Wqp*;?mSe5$dYZmkO{KGRsww$>vmUTUo8TI-^U&#U#` z1)$<)QG9Q#4g02rYznrUgzPd3;6;c~0+No}=qQ8n0zOY|V2D%ny3tksdT$!79Uc|2 z);zaRx7SfT@zfKg0#v5dc2!5&QRP+Trf7uI7@Txe4w%sljS)$qr|i(0TR<5VSx_X2 zHLf>6+sTIgG+)`-bz24hBw6^-*imIr zVQa6U1v?uAX`Z?uU|%f@<;{DGUWCc1_;6GL*+o=<2vFD-EGo#hffOtqwUpqgk+Jh= zyKJxHS1(%`o{Y-p7zK*D7j6-Tx*mjO-}V^NXTSD&sGL?oU|ksmM^Lq7PP>_?4^H{tvG-m%c1e<#6N~&)K97H2QNO{D$W8shobB8XK_Zbx|d@z z#CHcfMd>0otw;WeBBREq8RU$vaa$jI1 zMrL_Y<;3?FDLi}J0S)!tI3?kow ztFm&Hy0pl3k<>(L@SBvyKr`{+B_jTO2*N)RiyTKvpG+(0IT1-W#By@2?cr2(T+vC- zqSq0fKF29~D$2AUAd8LQ-4|rZ*m*oPucr@|*RzOB9gTRU>?%pFZ-sI3tBG&!t`^14 z{jeN^+V|nD66jtkwXNOj&0U=#fPNH~X}Fo0Ln7HH4ig~v%?4iO9Wc41^7SUVh?Y6N zCf9}KJ!Ic8IQl;9djr8ZaJ% zQZ6jd6UAgpikjyZV@`xB$*>d9-BtFO-9K>My@HtUHqnJ6E}bn$-##95!}A)vyugx9 za~%X>mIc8}PT0o{WCu>ztBCwz6TMB8En%xg6lPONdz!w_ce(#A!w*W^PGXYwd3 zY?}AAjfx$kvG=KWI+t~65>ui9ceW-eN~1$-(|$fMx%;0jkzX{}A2{=r)Qu*(FwazY zd$^OOQRvJ!Wq&Am!ziDBe>!;&?c>Ie#&J*_aRPw%WSB>?)0Md(o8FgPytgsj!^yVX z;mCoJxxS^aJ(}F9p&moOT$J{nOIqgs8z+-VZCbxOG&X&9THI+F3jV)88U3a=W)%DhTa#cw~ zvAK-{Wp()DeU#733!jHvpQj?9+iss*IiIV#&)MWNoA{iKK7EgXliGgV-^kU_=hfxv Vmohzhjj*)1G+Y17EzLFczW@oC7Rvwt literal 0 HcmV?d00001 diff --git a/ftplugin/python/pyflakes/pyflakes/scripts/__init__.py b/ftplugin/python/pyflakes/pyflakes/scripts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ftplugin/python/pyflakes/pyflakes/scripts/pyflakes.py b/ftplugin/python/pyflakes/pyflakes/scripts/pyflakes.py new file mode 100644 index 00000000..6b1dae22 --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/scripts/pyflakes.py @@ -0,0 +1,90 @@ + +""" +Implementation of the command-line I{pyflakes} tool. +""" + +import sys +import os +import _ast + +checker = __import__('pyflakes.checker').checker + +def check(codeString, filename): + """ + Check the Python source given by C{codeString} for flakes. + + @param codeString: The Python source to check. + @type codeString: C{str} + + @param filename: The name of the file the source came from, used to report + errors. + @type filename: C{str} + + @return: The number of warnings emitted. + @rtype: C{int} + """ + # First, compile into an AST and handle syntax errors. + try: + tree = compile(codeString, filename, "exec", _ast.PyCF_ONLY_AST) + except SyntaxError, value: + msg = value.args[0] + + (lineno, offset, text) = value.lineno, value.offset, value.text + + # If there's an encoding problem with the file, the text is None. + if text is None: + # Avoid using msg, since for the only known case, it contains a + # bogus message that claims the encoding the file declared was + # unknown. + print >> sys.stderr, "%s: problem decoding source" % (filename, ) + else: + line = text.splitlines()[-1] + + if offset is not None: + offset = offset - (len(text) - len(line)) + + print >> sys.stderr, '%s:%d: %s' % (filename, lineno, msg) + print >> sys.stderr, line + + if offset is not None: + print >> sys.stderr, " " * offset, "^" + + return 1 + else: + # Okay, it's syntactically valid. Now check it. + w = checker.Checker(tree, filename) + w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno)) + for warning in w.messages: + print warning + return len(w.messages) + + +def checkPath(filename): + """ + Check the given path, printing out any warnings detected. + + @return: the number of warnings printed + """ + try: + return check(file(filename, 'U').read() + '\n', filename) + except IOError, msg: + print >> sys.stderr, "%s: %s" % (filename, msg.args[1]) + return 1 + + +def main(): + warnings = 0 + args = sys.argv[1:] + if args: + for arg in args: + if os.path.isdir(arg): + for dirpath, dirnames, filenames in os.walk(arg): + for filename in filenames: + if filename.endswith('.py'): + warnings += checkPath(os.path.join(dirpath, filename)) + else: + warnings += checkPath(arg) + else: + warnings += check(sys.stdin.read(), '') + + raise SystemExit(warnings > 0) diff --git a/ftplugin/python/pyflakes/pyflakes/test/__init__.py b/ftplugin/python/pyflakes/pyflakes/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ftplugin/python/pyflakes/pyflakes/test/harness.py b/ftplugin/python/pyflakes/pyflakes/test/harness.py new file mode 100644 index 00000000..7cd22772 --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/test/harness.py @@ -0,0 +1,27 @@ + +import textwrap +import _ast + +from twisted.trial import unittest + +from pyflakes import checker + + +class Test(unittest.TestCase): + + def flakes(self, input, *expectedOutputs, **kw): + ast = compile(textwrap.dedent(input), "", "exec", + _ast.PyCF_ONLY_AST) + w = checker.Checker(ast, **kw) + outputs = [type(o) for o in w.messages] + expectedOutputs = list(expectedOutputs) + outputs.sort() + expectedOutputs.sort() + self.assert_(outputs == expectedOutputs, '''\ +for input: +%s +expected outputs: +%s +but got: +%s''' % (input, repr(expectedOutputs), '\n'.join([str(o) for o in w.messages]))) + return w diff --git a/ftplugin/python/pyflakes/pyflakes/test/test_imports.py b/ftplugin/python/pyflakes/pyflakes/test/test_imports.py new file mode 100644 index 00000000..08e4580a --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/test/test_imports.py @@ -0,0 +1,673 @@ + +from sys import version_info + +from pyflakes import messages as m +from pyflakes.test import harness + +class Test(harness.Test): + + def test_unusedImport(self): + self.flakes('import fu, bar', m.UnusedImport, m.UnusedImport) + self.flakes('from baz import fu, bar', m.UnusedImport, m.UnusedImport) + + def test_aliasedImport(self): + self.flakes('import fu as FU, bar as FU', m.RedefinedWhileUnused, m.UnusedImport) + self.flakes('from moo import fu as FU, bar as FU', m.RedefinedWhileUnused, m.UnusedImport) + + def test_usedImport(self): + self.flakes('import fu; print fu') + self.flakes('from baz import fu; print fu') + + def test_redefinedWhileUnused(self): + self.flakes('import fu; fu = 3', m.RedefinedWhileUnused) + self.flakes('import fu; del fu', m.RedefinedWhileUnused) + self.flakes('import fu; fu, bar = 3', m.RedefinedWhileUnused) + self.flakes('import fu; [fu, bar] = 3', m.RedefinedWhileUnused) + + def test_redefinedByFunction(self): + self.flakes(''' + import fu + def fu(): + pass + ''', m.RedefinedWhileUnused) + + def test_redefinedInNestedFunction(self): + """ + Test that shadowing a global name with a nested function definition + generates a warning. + """ + self.flakes(''' + import fu + def bar(): + def baz(): + def fu(): + pass + ''', m.RedefinedWhileUnused, m.UnusedImport) + + def test_redefinedByClass(self): + self.flakes(''' + import fu + class fu: + pass + ''', m.RedefinedWhileUnused) + + + def test_redefinedBySubclass(self): + """ + If an imported name is redefined by a class statement which also uses + that name in the bases list, no warning is emitted. + """ + self.flakes(''' + from fu import bar + class bar(bar): + pass + ''') + + + def test_redefinedInClass(self): + """ + Test that shadowing a global with a class attribute does not produce a + warning. + """ + self.flakes(''' + import fu + class bar: + fu = 1 + print fu + ''') + + def test_usedInFunction(self): + self.flakes(''' + import fu + def fun(): + print fu + ''') + + def test_shadowedByParameter(self): + self.flakes(''' + import fu + def fun(fu): + print fu + ''', m.UnusedImport) + + self.flakes(''' + import fu + def fun(fu): + print fu + print fu + ''') + + def test_newAssignment(self): + self.flakes('fu = None') + + def test_usedInGetattr(self): + self.flakes('import fu; fu.bar.baz') + self.flakes('import fu; "bar".fu.baz', m.UnusedImport) + + def test_usedInSlice(self): + self.flakes('import fu; print fu.bar[1:]') + + def test_usedInIfBody(self): + self.flakes(''' + import fu + if True: print fu + ''') + + def test_usedInIfConditional(self): + self.flakes(''' + import fu + if fu: pass + ''') + + def test_usedInElifConditional(self): + self.flakes(''' + import fu + if False: pass + elif fu: pass + ''') + + def test_usedInElse(self): + self.flakes(''' + import fu + if False: pass + else: print fu + ''') + + def test_usedInCall(self): + self.flakes('import fu; fu.bar()') + + def test_usedInClass(self): + self.flakes(''' + import fu + class bar: + bar = fu + ''') + + def test_usedInClassBase(self): + self.flakes(''' + import fu + class bar(object, fu.baz): + pass + ''') + + def test_notUsedInNestedScope(self): + self.flakes(''' + import fu + def bleh(): + pass + print fu + ''') + + def test_usedInFor(self): + self.flakes(''' + import fu + for bar in range(9): + print fu + ''') + + def test_usedInForElse(self): + self.flakes(''' + import fu + for bar in range(10): + pass + else: + print fu + ''') + + def test_redefinedByFor(self): + self.flakes(''' + import fu + for fu in range(2): + pass + ''', m.RedefinedWhileUnused) + + def test_shadowedByFor(self): + """ + Test that shadowing a global name with a for loop variable generates a + warning. + """ + self.flakes(''' + import fu + fu.bar() + for fu in (): + pass + ''', m.ImportShadowedByLoopVar) + + def test_shadowedByForDeep(self): + """ + Test that shadowing a global name with a for loop variable nested in a + tuple unpack generates a warning. + """ + self.flakes(''' + import fu + fu.bar() + for (x, y, z, (a, b, c, (fu,))) in (): + pass + ''', m.ImportShadowedByLoopVar) + + def test_usedInReturn(self): + self.flakes(''' + import fu + def fun(): + return fu + ''') + + def test_usedInOperators(self): + self.flakes('import fu; 3 + fu.bar') + self.flakes('import fu; 3 % fu.bar') + self.flakes('import fu; 3 - fu.bar') + self.flakes('import fu; 3 * fu.bar') + self.flakes('import fu; 3 ** fu.bar') + self.flakes('import fu; 3 / fu.bar') + self.flakes('import fu; 3 // fu.bar') + self.flakes('import fu; -fu.bar') + self.flakes('import fu; ~fu.bar') + self.flakes('import fu; 1 == fu.bar') + self.flakes('import fu; 1 | fu.bar') + self.flakes('import fu; 1 & fu.bar') + self.flakes('import fu; 1 ^ fu.bar') + self.flakes('import fu; 1 >> fu.bar') + self.flakes('import fu; 1 << fu.bar') + + def test_usedInAssert(self): + self.flakes('import fu; assert fu.bar') + + def test_usedInSubscript(self): + self.flakes('import fu; fu.bar[1]') + + def test_usedInLogic(self): + self.flakes('import fu; fu and False') + self.flakes('import fu; fu or False') + self.flakes('import fu; not fu.bar') + + def test_usedInList(self): + self.flakes('import fu; [fu]') + + def test_usedInTuple(self): + self.flakes('import fu; (fu,)') + + def test_usedInTry(self): + self.flakes(''' + import fu + try: fu + except: pass + ''') + + def test_usedInExcept(self): + self.flakes(''' + import fu + try: fu + except: pass + ''') + + def test_redefinedByExcept(self): + self.flakes(''' + import fu + try: pass + except Exception, fu: pass + ''', m.RedefinedWhileUnused) + + def test_usedInRaise(self): + self.flakes(''' + import fu + raise fu.bar + ''') + + def test_usedInYield(self): + self.flakes(''' + import fu + def gen(): + yield fu + ''') + + def test_usedInDict(self): + self.flakes('import fu; {fu:None}') + self.flakes('import fu; {1:fu}') + + def test_usedInParameterDefault(self): + self.flakes(''' + import fu + def f(bar=fu): + pass + ''') + + def test_usedInAttributeAssign(self): + self.flakes('import fu; fu.bar = 1') + + def test_usedInKeywordArg(self): + self.flakes('import fu; fu.bar(stuff=fu)') + + def test_usedInAssignment(self): + self.flakes('import fu; bar=fu') + self.flakes('import fu; n=0; n+=fu') + + def test_usedInListComp(self): + self.flakes('import fu; [fu for _ in range(1)]') + self.flakes('import fu; [1 for _ in range(1) if fu]') + + def test_redefinedByListComp(self): + self.flakes('import fu; [1 for fu in range(1)]', m.RedefinedWhileUnused) + + + def test_usedInTryFinally(self): + self.flakes(''' + import fu + try: pass + finally: fu + ''') + + self.flakes(''' + import fu + try: fu + finally: pass + ''') + + def test_usedInWhile(self): + self.flakes(''' + import fu + while 0: + fu + ''') + + self.flakes(''' + import fu + while fu: pass + ''') + + def test_usedInGlobal(self): + self.flakes(''' + import fu + def f(): global fu + ''', m.UnusedImport) + + def test_usedInBackquote(self): + self.flakes('import fu; `fu`') + + def test_usedInExec(self): + self.flakes('import fu; exec "print 1" in fu.bar') + + def test_usedInLambda(self): + self.flakes('import fu; lambda: fu') + + def test_shadowedByLambda(self): + self.flakes('import fu; lambda fu: fu', m.UnusedImport) + + def test_usedInSliceObj(self): + self.flakes('import fu; "meow"[::fu]') + + def test_unusedInNestedScope(self): + self.flakes(''' + def bar(): + import fu + fu + ''', m.UnusedImport, m.UndefinedName) + + def test_methodsDontUseClassScope(self): + self.flakes(''' + class bar: + import fu + def fun(self): + fu + ''', m.UnusedImport, m.UndefinedName) + + def test_nestedFunctionsNestScope(self): + self.flakes(''' + def a(): + def b(): + fu + import fu + ''') + + def test_nestedClassAndFunctionScope(self): + self.flakes(''' + def a(): + import fu + class b: + def c(self): + print fu + ''') + + def test_importStar(self): + self.flakes('from fu import *', m.ImportStarUsed) + + + def test_packageImport(self): + """ + If a dotted name is imported and used, no warning is reported. + """ + self.flakes(''' + import fu.bar + fu.bar + ''') + + + def test_unusedPackageImport(self): + """ + If a dotted name is imported and not used, an unused import warning is + reported. + """ + self.flakes('import fu.bar', m.UnusedImport) + + + def test_duplicateSubmoduleImport(self): + """ + If a submodule of a package is imported twice, an unused import warning + and a redefined while unused warning are reported. + """ + self.flakes(''' + import fu.bar, fu.bar + fu.bar + ''', m.RedefinedWhileUnused) + self.flakes(''' + import fu.bar + import fu.bar + fu.bar + ''', m.RedefinedWhileUnused) + + + def test_differentSubmoduleImport(self): + """ + If two different submodules of a package are imported, no duplicate + import warning is reported for the package. + """ + self.flakes(''' + import fu.bar, fu.baz + fu.bar, fu.baz + ''') + self.flakes(''' + import fu.bar + import fu.baz + fu.bar, fu.baz + ''') + + def test_assignRHSFirst(self): + self.flakes('import fu; fu = fu') + self.flakes('import fu; fu, bar = fu') + self.flakes('import fu; [fu, bar] = fu') + self.flakes('import fu; fu += fu') + + def test_tryingMultipleImports(self): + self.flakes(''' + try: + import fu + except ImportError: + import bar as fu + ''') + test_tryingMultipleImports.todo = '' + + def test_nonGlobalDoesNotRedefine(self): + self.flakes(''' + import fu + def a(): + fu = 3 + return fu + fu + ''') + + def test_functionsRunLater(self): + self.flakes(''' + def a(): + fu + import fu + ''') + + def test_functionNamesAreBoundNow(self): + self.flakes(''' + import fu + def fu(): + fu + fu + ''', m.RedefinedWhileUnused) + + def test_ignoreNonImportRedefinitions(self): + self.flakes('a = 1; a = 2') + + def test_importingForImportError(self): + self.flakes(''' + try: + import fu + except ImportError: + pass + ''') + test_importingForImportError.todo = '' + + def test_importedInClass(self): + '''Imports in class scope can be used through self''' + self.flakes(''' + class c: + import i + def __init__(self): + self.i + ''') + test_importedInClass.todo = 'requires evaluating attribute access' + + def test_futureImport(self): + '''__future__ is special''' + self.flakes('from __future__ import division') + self.flakes(''' + "docstring is allowed before future import" + from __future__ import division + ''') + + def test_futureImportFirst(self): + """ + __future__ imports must come before anything else. + """ + self.flakes(''' + x = 5 + from __future__ import division + ''', m.LateFutureImport) + self.flakes(''' + from foo import bar + from __future__ import division + bar + ''', m.LateFutureImport) + + + +class TestSpecialAll(harness.Test): + """ + Tests for suppression of unused import warnings by C{__all__}. + """ + def test_ignoredInFunction(self): + """ + An C{__all__} definition does not suppress unused import warnings in a + function scope. + """ + self.flakes(''' + def foo(): + import bar + __all__ = ["bar"] + ''', m.UnusedImport, m.UnusedVariable) + + + def test_ignoredInClass(self): + """ + An C{__all__} definition does not suppress unused import warnings in a + class scope. + """ + self.flakes(''' + class foo: + import bar + __all__ = ["bar"] + ''', m.UnusedImport) + + + def test_warningSuppressed(self): + """ + If a name is imported and unused but is named in C{__all__}, no warning + is reported. + """ + self.flakes(''' + import foo + __all__ = ["foo"] + ''') + + + def test_unrecognizable(self): + """ + If C{__all__} is defined in a way that can't be recognized statically, + it is ignored. + """ + self.flakes(''' + import foo + __all__ = ["f" + "oo"] + ''', m.UnusedImport) + self.flakes(''' + import foo + __all__ = [] + ["foo"] + ''', m.UnusedImport) + + + def test_unboundExported(self): + """ + If C{__all__} includes a name which is not bound, a warning is emitted. + """ + self.flakes(''' + __all__ = ["foo"] + ''', m.UndefinedExport) + + # Skip this in __init__.py though, since the rules there are a little + # different. + for filename in ["foo/__init__.py", "__init__.py"]: + self.flakes(''' + __all__ = ["foo"] + ''', filename=filename) + + + def test_usedInGenExp(self): + """ + Using a global in a generator expression results in no warnings. + """ + self.flakes('import fu; (fu for _ in range(1))') + self.flakes('import fu; (1 for _ in range(1) if fu)') + + + def test_redefinedByGenExp(self): + """ + Re-using a global name as the loop variable for a generator + expression results in a redefinition warning. + """ + self.flakes('import fu; (1 for fu in range(1))', m.RedefinedWhileUnused) + + + def test_usedAsDecorator(self): + """ + Using a global name in a decorator statement results in no warnings, + but using an undefined name in a decorator statement results in an + undefined name warning. + """ + self.flakes(''' + from interior import decorate + @decorate + def f(): + return "hello" + ''') + + self.flakes(''' + from interior import decorate + @decorate('value') + def f(): + return "hello" + ''') + + self.flakes(''' + @decorate + def f(): + return "hello" + ''', m.UndefinedName) + + +class Python26Tests(harness.Test): + """ + Tests for checking of syntax which is valid in PYthon 2.6 and newer. + """ + if version_info < (2, 6): + skip = "Python 2.6 required for class decorator tests." + + + def test_usedAsClassDecorator(self): + """ + Using an imported name as a class decorator results in no warnings, + but using an undefined name as a class decorator results in an + undefined name warning. + """ + self.flakes(''' + from interior import decorate + @decorate + class foo: + pass + ''') + + self.flakes(''' + from interior import decorate + @decorate("foo") + class bar: + pass + ''') + + self.flakes(''' + @decorate + class foo: + pass + ''', m.UndefinedName) diff --git a/ftplugin/python/pyflakes/pyflakes/test/test_other.py b/ftplugin/python/pyflakes/pyflakes/test/test_other.py new file mode 100644 index 00000000..2b7723ce --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/test/test_other.py @@ -0,0 +1,575 @@ +# (c) 2005-2010 Divmod, Inc. +# See LICENSE file for details + +""" +Tests for various Pyflakes behavior. +""" + +from sys import version_info + +from pyflakes import messages as m +from pyflakes.test import harness + + +class Test(harness.Test): + + def test_duplicateArgs(self): + self.flakes('def fu(bar, bar): pass', m.DuplicateArgument) + + def test_localReferencedBeforeAssignment(self): + self.flakes(''' + a = 1 + def f(): + a; a=1 + f() + ''', m.UndefinedName) + test_localReferencedBeforeAssignment.todo = 'this requires finding all assignments in the function body first' + + def test_redefinedFunction(self): + """ + Test that shadowing a function definition with another one raises a + warning. + """ + self.flakes(''' + def a(): pass + def a(): pass + ''', m.RedefinedFunction) + + def test_redefinedClassFunction(self): + """ + Test that shadowing a function definition in a class suite with another + one raises a warning. + """ + self.flakes(''' + class A: + def a(): pass + def a(): pass + ''', m.RedefinedFunction) + + def test_functionDecorator(self): + """ + Test that shadowing a function definition with a decorated version of + that function does not raise a warning. + """ + self.flakes(''' + from somewhere import somedecorator + + def a(): pass + a = somedecorator(a) + ''') + + def test_classFunctionDecorator(self): + """ + Test that shadowing a function definition in a class suite with a + decorated version of that function does not raise a warning. + """ + self.flakes(''' + class A: + def a(): pass + a = classmethod(a) + ''') + + def test_unaryPlus(self): + '''Don't die on unary +''' + self.flakes('+1') + + + def test_undefinedBaseClass(self): + """ + If a name in the base list of a class definition is undefined, a + warning is emitted. + """ + self.flakes(''' + class foo(foo): + pass + ''', m.UndefinedName) + + + def test_classNameUndefinedInClassBody(self): + """ + If a class name is used in the body of that class's definition and + the name is not already defined, a warning is emitted. + """ + self.flakes(''' + class foo: + foo + ''', m.UndefinedName) + + + def test_classNameDefinedPreviously(self): + """ + If a class name is used in the body of that class's definition and + the name was previously defined in some other way, no warning is + emitted. + """ + self.flakes(''' + foo = None + class foo: + foo + ''') + + + def test_comparison(self): + """ + If a defined name is used on either side of any of the six comparison + operators, no warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x < y + x <= y + x == y + x != y + x >= y + x > y + ''') + + + def test_identity(self): + """ + If a deefined name is used on either side of an identity test, no + warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x is y + x is not y + ''') + + + def test_containment(self): + """ + If a defined name is used on either side of a containment test, no + warning is emitted. + """ + self.flakes(''' + x = 10 + y = 20 + x in y + x not in y + ''') + + + def test_loopControl(self): + """ + break and continue statements are supported. + """ + self.flakes(''' + for x in [1, 2]: + break + ''') + self.flakes(''' + for x in [1, 2]: + continue + ''') + + + def test_ellipsis(self): + """ + Ellipsis in a slice is supported. + """ + self.flakes(''' + [1, 2][...] + ''') + + + def test_extendedSlice(self): + """ + Extended slices are supported. + """ + self.flakes(''' + x = 3 + [1, 2][x,:] + ''') + + + +class TestUnusedAssignment(harness.Test): + """ + Tests for warning about unused assignments. + """ + + def test_unusedVariable(self): + """ + Warn when a variable in a function is assigned a value that's never + used. + """ + self.flakes(''' + def a(): + b = 1 + ''', m.UnusedVariable) + + + def test_assignToGlobal(self): + """ + Assigning to a global and then not using that global is perfectly + acceptable. Do not mistake it for an unused local variable. + """ + self.flakes(''' + b = 0 + def a(): + global b + b = 1 + ''') + + + def test_assignToMember(self): + """ + Assigning to a member of another object and then not using that member + variable is perfectly acceptable. Do not mistake it for an unused + local variable. + """ + # XXX: Adding this test didn't generate a failure. Maybe not + # necessary? + self.flakes(''' + class b: + pass + def a(): + b.foo = 1 + ''') + + + def test_assignInForLoop(self): + """ + Don't warn when a variable in a for loop is assigned to but not used. + """ + self.flakes(''' + def f(): + for i in range(10): + pass + ''') + + + def test_assignInListComprehension(self): + """ + Don't warn when a variable in a list comprehension is assigned to but + not used. + """ + self.flakes(''' + def f(): + [None for i in range(10)] + ''') + + + def test_generatorExpression(self): + """ + Don't warn when a variable in a generator expression is assigned to but not used. + """ + self.flakes(''' + def f(): + (None for i in range(10)) + ''') + + + def test_assignmentInsideLoop(self): + """ + Don't warn when a variable assignment occurs lexically after its use. + """ + self.flakes(''' + def f(): + x = None + for i in range(10): + if i > 2: + return x + x = i * 2 + ''') + + + def test_tupleUnpacking(self): + """ + Don't warn when a variable included in tuple unpacking is unused. It's + very common for variables in a tuple unpacking assignment to be unused + in good Python code, so warning will only create false positives. + """ + self.flakes(''' + def f(): + (x, y) = 1, 2 + ''') + + + def test_listUnpacking(self): + """ + Don't warn when a variable included in list unpacking is unused. + """ + self.flakes(''' + def f(): + [x, y] = [1, 2] + ''') + + + def test_closedOver(self): + """ + Don't warn when the assignment is used in an inner function. + """ + self.flakes(''' + def barMaker(): + foo = 5 + def bar(): + return foo + return bar + ''') + + + def test_doubleClosedOver(self): + """ + Don't warn when the assignment is used in an inner function, even if + that inner function itself is in an inner function. + """ + self.flakes(''' + def barMaker(): + foo = 5 + def bar(): + def baz(): + return foo + return bar + ''') + + + +class Python25Test(harness.Test): + """ + Tests for checking of syntax only available in Python 2.5 and newer. + """ + if version_info < (2, 5): + skip = "Python 2.5 required for if-else and with tests" + + def test_ifexp(self): + """ + Test C{foo if bar else baz} statements. + """ + self.flakes("a = 'moo' if True else 'oink'") + self.flakes("a = foo if True else 'oink'", m.UndefinedName) + self.flakes("a = 'moo' if True else bar", m.UndefinedName) + + + def test_withStatementNoNames(self): + """ + No warnings are emitted for using inside or after a nameless C{with} + statement a name defined beforehand. + """ + self.flakes(''' + from __future__ import with_statement + bar = None + with open("foo"): + bar + bar + ''') + + def test_withStatementSingleName(self): + """ + No warnings are emitted for using a name defined by a C{with} statement + within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + bar + bar + ''') + + + def test_withStatementAttributeName(self): + """ + No warnings are emitted for using an attribute as the target of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo.bar: + pass + ''') + + + def test_withStatementSubscript(self): + """ + No warnings are emitted for using a subscript as the target of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo[0]: + pass + ''') + + + def test_withStatementSubscriptUndefined(self): + """ + An undefined name warning is emitted if the subscript used as the + target of a C{with} statement is not defined. + """ + self.flakes(''' + from __future__ import with_statement + import foo + with open('foo') as foo[bar]: + pass + ''', m.UndefinedName) + + + def test_withStatementTupleNames(self): + """ + No warnings are emitted for using any of the tuple of names defined by + a C{with} statement within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as (bar, baz): + bar, baz + bar, baz + ''') + + + def test_withStatementListNames(self): + """ + No warnings are emitted for using any of the list of names defined by a + C{with} statement within the suite or afterwards. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as [bar, baz]: + bar, baz + bar, baz + ''') + + + def test_withStatementComplicatedTarget(self): + """ + If the target of a C{with} statement uses any or all of the valid forms + for that part of the grammar (See + U{http://docs.python.org/reference/compound_stmts.html#the-with-statement}), + the names involved are checked both for definedness and any bindings + created are respected in the suite of the statement and afterwards. + """ + self.flakes(''' + from __future__ import with_statement + c = d = e = g = h = i = None + with open('foo') as [(a, b), c[d], e.f, g[h:i]]: + a, b, c, d, e, g, h, i + a, b, c, d, e, g, h, i + ''') + + + def test_withStatementSingleNameUndefined(self): + """ + An undefined name warning is emitted if the name first defined by a + C{with} statement is used before the C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + bar + with open('foo') as bar: + pass + ''', m.UndefinedName) + + + def test_withStatementTupleNamesUndefined(self): + """ + An undefined name warning is emitted if a name first defined by a the + tuple-unpacking form of the C{with} statement is used before the + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + baz + with open('foo') as (bar, baz): + pass + ''', m.UndefinedName) + + + def test_withStatementSingleNameRedefined(self): + """ + A redefined name warning is emitted if a name bound by an import is + rebound by the name defined by a C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import bar + with open('foo') as bar: + pass + ''', m.RedefinedWhileUnused) + + + def test_withStatementTupleNamesRedefined(self): + """ + A redefined name warning is emitted if a name bound by an import is + rebound by one of the names defined by the tuple-unpacking form of a + C{with} statement. + """ + self.flakes(''' + from __future__ import with_statement + import bar + with open('foo') as (bar, baz): + pass + ''', m.RedefinedWhileUnused) + + + def test_withStatementUndefinedInside(self): + """ + An undefined name warning is emitted if a name is used inside the + body of a C{with} statement without first being bound. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + baz + ''', m.UndefinedName) + + + def test_withStatementNameDefinedInBody(self): + """ + A name defined in the body of a C{with} statement can be used after + the body ends without warning. + """ + self.flakes(''' + from __future__ import with_statement + with open('foo') as bar: + baz = 10 + baz + ''') + + + def test_withStatementUndefinedInExpression(self): + """ + An undefined name warning is emitted if a name in the I{test} + expression of a C{with} statement is undefined. + """ + self.flakes(''' + from __future__ import with_statement + with bar as baz: + pass + ''', m.UndefinedName) + + self.flakes(''' + from __future__ import with_statement + with bar as bar: + pass + ''', m.UndefinedName) + + + +class Python27Test(harness.Test): + """ + Tests for checking of syntax only available in Python 2.7 and newer. + """ + if version_info < (2, 7): + skip = "Python 2.7 required for dict/set comprehension tests" + + def test_dictComprehension(self): + """ + Dict comprehensions are properly handled. + """ + self.flakes(''' + a = {1: x for x in range(10)} + ''') + + def test_setComprehensionAndLiteral(self): + """ + Set comprehensions are properly handled. + """ + self.flakes(''' + a = {1, 2, 3} + b = {x for x in range(10)} + ''') diff --git a/ftplugin/python/pyflakes/pyflakes/test/test_script.py b/ftplugin/python/pyflakes/pyflakes/test/test_script.py new file mode 100644 index 00000000..233e59ed --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/test/test_script.py @@ -0,0 +1,185 @@ + +""" +Tests for L{pyflakes.scripts.pyflakes}. +""" + +import sys +from StringIO import StringIO + +from twisted.python.filepath import FilePath +from twisted.trial.unittest import TestCase + +from pyflakes.scripts.pyflakes import checkPath + +def withStderrTo(stderr, f): + """ + Call C{f} with C{sys.stderr} redirected to C{stderr}. + """ + (outer, sys.stderr) = (sys.stderr, stderr) + try: + return f() + finally: + sys.stderr = outer + + + +class CheckTests(TestCase): + """ + Tests for L{check} and L{checkPath} which check a file for flakes. + """ + def test_missingTrailingNewline(self): + """ + Source which doesn't end with a newline shouldn't cause any + exception to be raised nor an error indicator to be returned by + L{check}. + """ + fName = self.mktemp() + FilePath(fName).setContent("def foo():\n\tpass\n\t") + self.assertFalse(checkPath(fName)) + + + def test_checkPathNonExisting(self): + """ + L{checkPath} handles non-existing files. + """ + err = StringIO() + count = withStderrTo(err, lambda: checkPath('extremo')) + self.assertEquals(err.getvalue(), 'extremo: No such file or directory\n') + self.assertEquals(count, 1) + + + def test_multilineSyntaxError(self): + """ + Source which includes a syntax error which results in the raised + L{SyntaxError.text} containing multiple lines of source are reported + with only the last line of that source. + """ + source = """\ +def foo(): + ''' + +def bar(): + pass + +def baz(): + '''quux''' +""" + + # Sanity check - SyntaxError.text should be multiple lines, if it + # isn't, something this test was unprepared for has happened. + def evaluate(source): + exec source + exc = self.assertRaises(SyntaxError, evaluate, source) + self.assertTrue(exc.text.count('\n') > 1) + + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + + self.assertEqual( + err.getvalue(), + """\ +%s:8: invalid syntax + '''quux''' + ^ +""" % (sourcePath.path,)) + + + def test_eofSyntaxError(self): + """ + The error reported for source files which end prematurely causing a + syntax error reflects the cause for the syntax error. + """ + source = "def foo(" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: unexpected EOF while parsing +def foo( + ^ +""" % (sourcePath.path,)) + + + def test_nonDefaultFollowsDefaultSyntaxError(self): + """ + Source which has a non-default argument following a default argument + should include the line number of the syntax error. However these + exceptions do not include an offset. + """ + source = """\ +def foo(bar=baz, bax): + pass +""" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: non-default argument follows default argument +def foo(bar=baz, bax): +""" % (sourcePath.path,)) + + + def test_nonKeywordAfterKeywordSyntaxError(self): + """ + Source which has a non-keyword argument after a keyword argument should + include the line number of the syntax error. However these exceptions + do not include an offset. + """ + source = """\ +foo(bar=baz, bax) +""" + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEqual(count, 1) + self.assertEqual( + err.getvalue(), + """\ +%s:1: non-keyword arg after keyword arg +foo(bar=baz, bax) +""" % (sourcePath.path,)) + + + def test_permissionDenied(self): + """ + If the a source file is not readable, this is reported on standard + error. + """ + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent('') + sourcePath.chmod(0) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEquals(count, 1) + self.assertEquals( + err.getvalue(), "%s: Permission denied\n" % (sourcePath.path,)) + + + def test_misencodedFile(self): + """ + If a source file contains bytes which cannot be decoded, this is + reported on stderr. + """ + source = u"""\ +# coding: ascii +x = "\N{SNOWMAN}" +""".encode('utf-8') + sourcePath = FilePath(self.mktemp()) + sourcePath.setContent(source) + err = StringIO() + count = withStderrTo(err, lambda: checkPath(sourcePath.path)) + self.assertEquals(count, 1) + self.assertEquals( + err.getvalue(), "%s: problem decoding source\n" % (sourcePath.path,)) diff --git a/ftplugin/python/pyflakes/pyflakes/test/test_undefined_names.py b/ftplugin/python/pyflakes/pyflakes/test/test_undefined_names.py new file mode 100644 index 00000000..309f0b9f --- /dev/null +++ b/ftplugin/python/pyflakes/pyflakes/test/test_undefined_names.py @@ -0,0 +1,265 @@ + +from _ast import PyCF_ONLY_AST + +from twisted.trial.unittest import TestCase + +from pyflakes import messages as m, checker +from pyflakes.test import harness + + +class Test(harness.Test): + def test_undefined(self): + self.flakes('bar', m.UndefinedName) + + def test_definedInListComp(self): + self.flakes('[a for a in range(10) if a]') + + + def test_functionsNeedGlobalScope(self): + self.flakes(''' + class a: + def b(): + fu + fu = 1 + ''') + + def test_builtins(self): + self.flakes('range(10)') + + + def test_magicGlobalsFile(self): + """ + Use of the C{__file__} magic global should not emit an undefined name + warning. + """ + self.flakes('__file__') + + + def test_magicGlobalsBuiltins(self): + """ + Use of the C{__builtins__} magic global should not emit an undefined + name warning. + """ + self.flakes('__builtins__') + + + def test_magicGlobalsName(self): + """ + Use of the C{__name__} magic global should not emit an undefined name + warning. + """ + self.flakes('__name__') + + + def test_magicGlobalsPath(self): + """ + Use of the C{__path__} magic global should not emit an undefined name + warning, if you refer to it from a file called __init__.py. + """ + self.flakes('__path__', m.UndefinedName) + self.flakes('__path__', filename='package/__init__.py') + + + def test_globalImportStar(self): + '''Can't find undefined names with import *''' + self.flakes('from fu import *; bar', m.ImportStarUsed) + + def test_localImportStar(self): + '''A local import * still allows undefined names to be found in upper scopes''' + self.flakes(''' + def a(): + from fu import * + bar + ''', m.ImportStarUsed, m.UndefinedName) + + def test_unpackedParameter(self): + '''Unpacked function parameters create bindings''' + self.flakes(''' + def a((bar, baz)): + bar; baz + ''') + + def test_definedByGlobal(self): + '''"global" can make an otherwise undefined name in another function defined''' + self.flakes(''' + def a(): global fu; fu = 1 + def b(): fu + ''') + test_definedByGlobal.todo = '' + + def test_globalInGlobalScope(self): + """ + A global statement in the global scope is ignored. + """ + self.flakes(''' + global x + def foo(): + print x + ''', m.UndefinedName) + + def test_del(self): + '''del deletes bindings''' + self.flakes('a = 1; del a; a', m.UndefinedName) + + def test_delGlobal(self): + '''del a global binding from a function''' + self.flakes(''' + a = 1 + def f(): + global a + del a + a + ''') + + def test_delUndefined(self): + '''del an undefined name''' + self.flakes('del a', m.UndefinedName) + + def test_globalFromNestedScope(self): + '''global names are available from nested scopes''' + self.flakes(''' + a = 1 + def b(): + def c(): + a + ''') + + def test_laterRedefinedGlobalFromNestedScope(self): + """ + Test that referencing a local name that shadows a global, before it is + defined, generates a warning. + """ + self.flakes(''' + a = 1 + def fun(): + a + a = 2 + return a + ''', m.UndefinedLocal) + + def test_laterRedefinedGlobalFromNestedScope2(self): + """ + Test that referencing a local name in a nested scope that shadows a + global declared in an enclosing scope, before it is defined, generates + a warning. + """ + self.flakes(''' + a = 1 + def fun(): + global a + def fun2(): + a + a = 2 + return a + ''', m.UndefinedLocal) + + + def test_intermediateClassScopeIgnored(self): + """ + If a name defined in an enclosing scope is shadowed by a local variable + and the name is used locally before it is bound, an unbound local + warning is emitted, even if there is a class scope between the enclosing + scope and the local scope. + """ + self.flakes(''' + def f(): + x = 1 + class g: + def h(self): + a = x + x = None + print x, a + print x + ''', m.UndefinedLocal) + + + def test_doubleNestingReportsClosestName(self): + """ + Test that referencing a local name in a nested scope that shadows a + variable declared in two different outer scopes before it is defined + in the innermost scope generates an UnboundLocal warning which + refers to the nearest shadowed name. + """ + exc = self.flakes(''' + def a(): + x = 1 + def b(): + x = 2 # line 5 + def c(): + x + x = 3 + return x + return x + return x + ''', m.UndefinedLocal).messages[0] + self.assertEqual(exc.message_args, ('x', 5)) + + + def test_laterRedefinedGlobalFromNestedScope3(self): + """ + Test that referencing a local name in a nested scope that shadows a + global, before it is defined, generates a warning. + """ + self.flakes(''' + def fun(): + a = 1 + def fun2(): + a + a = 1 + return a + return a + ''', m.UndefinedLocal) + + def test_nestedClass(self): + '''nested classes can access enclosing scope''' + self.flakes(''' + def f(foo): + class C: + bar = foo + def f(self): + return foo + return C() + + f(123).f() + ''') + + def test_badNestedClass(self): + '''free variables in nested classes must bind at class creation''' + self.flakes(''' + def f(): + class C: + bar = foo + foo = 456 + return foo + f() + ''', m.UndefinedName) + + def test_definedAsStarArgs(self): + '''star and double-star arg names are defined''' + self.flakes(''' + def f(a, *b, **c): + print a, b, c + ''') + + def test_definedInGenExp(self): + """ + Using the loop variable of a generator expression results in no + warnings. + """ + self.flakes('(a for a in xrange(10) if a)') + + + +class NameTests(TestCase): + """ + Tests for some extra cases of name handling. + """ + def test_impossibleContext(self): + """ + A Name node with an unrecognized context results in a RuntimeError being + raised. + """ + tree = compile("x = 10", "", "exec", PyCF_ONLY_AST) + # Make it into something unrecognizable. + tree.body[0].targets[0].ctx = object() + self.assertRaises(RuntimeError, checker.Checker, tree) diff --git a/ftplugin/python/pyflakes/setup.py b/ftplugin/python/pyflakes/setup.py new file mode 100644 index 00000000..85073371 --- /dev/null +++ b/ftplugin/python/pyflakes/setup.py @@ -0,0 +1,28 @@ +#!/usr/bin/python +# (c) 2005-2009 Divmod, Inc. See LICENSE file for details + +from distutils.core import setup + +setup( + name="pyflakes", + license="MIT", + version="0.4.0", + description="passive checker of Python programs", + author="Phil Frost", + maintainer="Moe Aboulkheir", + maintainer_email="moe@divmod.com", + url="http://www.divmod.org/trac/wiki/DivmodPyflakes", + packages=["pyflakes", "pyflakes.scripts", "pyflakes.test"], + scripts=["bin/pyflakes"], + long_description="""Pyflakes is program to analyze Python programs and detect various errors. It +works by parsing the source file, not importing it, so it is safe to use on +modules with side effects. It's also much faster.""", + classifiers=[ + "Development Status :: 6 - Mature", + "Environment :: Console", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python", + "Topic :: Software Development", + "Topic :: Utilities", + ]) diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim new file mode 100644 index 00000000..bc347756 --- /dev/null +++ b/plugin/NERD_tree.vim @@ -0,0 +1,4017 @@ +" ============================================================================ +" File: NERD_tree.vim +" Description: vim global plugin that provides a nice tree explorer +" Maintainer: Martin Grenfell +" Last Change: 28 December, 2011 +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +let s:NERD_tree_version = '4.2.0' + +" SECTION: Script init stuff {{{1 +"============================================================ +if exists("loaded_nerd_tree") + finish +endif +if v:version < 700 + echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" + finish +endif +let loaded_nerd_tree = 1 + +"for line continuation - i.e dont want C in &cpo +let s:old_cpo = &cpo +set cpo&vim + +let s:running_windows = has("win16") || has("win32") || has("win64") + +"Function: s:initVariable() function {{{2 +"This function is used to initialise a given variable to a given value. The +"variable is only initialised if it does not exist prior +" +"Args: +"var: the name of the var to be initialised +"value: the value to initialise var to +" +"Returns: +"1 if the var is set, 0 otherwise +function! s:initVariable(var, value) + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'" + return 1 + endif + return 0 +endfunction + +"SECTION: Init variable calls and other random constants {{{2 +call s:initVariable("g:NERDChristmasTree", 1) +call s:initVariable("g:NERDTreeAutoCenter", 1) +call s:initVariable("g:NERDTreeAutoCenterThreshold", 3) +call s:initVariable("g:NERDTreeCaseSensitiveSort", 0) +call s:initVariable("g:NERDTreeChDirMode", 0) +call s:initVariable("g:NERDTreeMinimalUI", 0) +if !exists("g:NERDTreeIgnore") + let g:NERDTreeIgnore = ['\~$'] +endif +call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks') +call s:initVariable("g:NERDTreeHighlightCursorline", 1) +call s:initVariable("g:NERDTreeHijackNetrw", 1) +call s:initVariable("g:NERDTreeMouseMode", 1) +call s:initVariable("g:NERDTreeNotificationThreshold", 100) +call s:initVariable("g:NERDTreeQuitOnOpen", 0) +call s:initVariable("g:NERDTreeShowBookmarks", 0) +call s:initVariable("g:NERDTreeShowFiles", 1) +call s:initVariable("g:NERDTreeShowHidden", 0) +call s:initVariable("g:NERDTreeShowLineNumbers", 0) +call s:initVariable("g:NERDTreeSortDirs", 1) +call s:initVariable("g:NERDTreeDirArrows", !s:running_windows) + +if !exists("g:NERDTreeSortOrder") + let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] +else + "if there isnt a * in the sort sequence then add one + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif +endif + +"we need to use this number many times for sorting... so we calculate it only +"once here +let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') + +if !exists('g:NERDTreeStatusline') + + "the exists() crap here is a hack to stop vim spazzing out when + "loading a session that was created with an open nerd tree. It spazzes + "because it doesnt store b:NERDTreeRoot (its a b: var, and its a hash) + let g:NERDTreeStatusline = "%{exists('b:NERDTreeRoot')?b:NERDTreeRoot.path.str():''}" + +endif +call s:initVariable("g:NERDTreeWinPos", "left") +call s:initVariable("g:NERDTreeWinSize", 31) + +"init the shell commands that will be used to copy nodes, and remove dir trees +" +"Note: the space after the command is important +if s:running_windows + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ') +else + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ') + call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ') +endif + + +"SECTION: Init variable calls for key mappings {{{2 +call s:initVariable("g:NERDTreeMapActivateNode", "o") +call s:initVariable("g:NERDTreeMapChangeRoot", "C") +call s:initVariable("g:NERDTreeMapChdir", "cd") +call s:initVariable("g:NERDTreeMapCloseChildren", "X") +call s:initVariable("g:NERDTreeMapCloseDir", "x") +call s:initVariable("g:NERDTreeMapDeleteBookmark", "D") +call s:initVariable("g:NERDTreeMapMenu", "m") +call s:initVariable("g:NERDTreeMapHelp", "?") +call s:initVariable("g:NERDTreeMapJumpFirstChild", "K") +call s:initVariable("g:NERDTreeMapJumpLastChild", "J") +call s:initVariable("g:NERDTreeMapJumpNextSibling", "") +call s:initVariable("g:NERDTreeMapJumpParent", "p") +call s:initVariable("g:NERDTreeMapJumpPrevSibling", "") +call s:initVariable("g:NERDTreeMapJumpRoot", "P") +call s:initVariable("g:NERDTreeMapOpenExpl", "e") +call s:initVariable("g:NERDTreeMapOpenInTab", "t") +call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T") +call s:initVariable("g:NERDTreeMapOpenRecursively", "O") +call s:initVariable("g:NERDTreeMapOpenSplit", "i") +call s:initVariable("g:NERDTreeMapOpenVSplit", "s") +call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode) +call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit) +call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit) +call s:initVariable("g:NERDTreeMapQuit", "q") +call s:initVariable("g:NERDTreeMapRefresh", "r") +call s:initVariable("g:NERDTreeMapRefreshRoot", "R") +call s:initVariable("g:NERDTreeMapToggleBookmarks", "B") +call s:initVariable("g:NERDTreeMapToggleFiles", "F") +call s:initVariable("g:NERDTreeMapToggleFilters", "f") +call s:initVariable("g:NERDTreeMapToggleHidden", "I") +call s:initVariable("g:NERDTreeMapToggleZoom", "A") +call s:initVariable("g:NERDTreeMapUpdir", "u") +call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") + +"SECTION: Script level variable declaration{{{2 +if s:running_windows + let s:escape_chars = " `\|\"#%&,?()\*^<>" +else + let s:escape_chars = " \\`\|\"#%&,?()\*^<>[]" +endif +let s:NERDTreeBufName = 'NERD_tree_' + +let s:tree_wid = 2 +let s:tree_markup_reg = '^[ `|]*[\-+~▾▸ ]\+' +let s:tree_up_dir_line = '.. (up a dir)' + +"the number to add to the nerd tree buffer name to make the buf name unique +let s:next_buffer_number = 1 + +" SECTION: Commands {{{1 +"============================================================ +"init the command that users start the nerd tree with +command! -n=? -complete=dir -bar NERDTree :call s:initNerdTree('') +command! -n=? -complete=dir -bar NERDTreeToggle :call s:toggle('') +command! -n=0 -bar NERDTreeClose :call s:closeTreeIfOpen() +command! -n=1 -complete=customlist,s:completeBookmarks -bar NERDTreeFromBookmark call s:initNerdTree('') +command! -n=0 -bar NERDTreeMirror call s:initNerdTreeMirror() +command! -n=0 -bar NERDTreeFind call s:findAndRevealPath() +" SECTION: Auto commands {{{1 +"============================================================ +augroup NERDTree + "Save the cursor position whenever we close the nerd tree + exec "autocmd BufWinLeave ". s:NERDTreeBufName ."* call saveScreenState()" + + "disallow insert mode in the NERDTree + exec "autocmd BufEnter ". s:NERDTreeBufName ."* stopinsert" + + "cache bookmarks when vim loads + autocmd VimEnter * call s:Bookmark.CacheBookmarks(0) + + "load all nerdtree plugins after vim starts + autocmd VimEnter * runtime! nerdtree_plugin/**/*.vim +augroup END + +if g:NERDTreeHijackNetrw + augroup NERDTreeHijackNetrw + autocmd VimEnter * silent! autocmd! FileExplorer + au BufEnter,VimEnter * call s:checkForBrowse(expand("")) + augroup END +endif + +"SECTION: Classes {{{1 +"============================================================ +"CLASS: Bookmark {{{2 +"============================================================ +let s:Bookmark = {} +" FUNCTION: Bookmark.activate() {{{3 +function! s:Bookmark.activate() + if self.path.isDirectory + call self.toRoot() + else + if self.validate() + let n = s:TreeFileNode.New(self.path) + call n.open() + call s:closeTreeIfQuitOnOpen() + endif + endif +endfunction +" FUNCTION: Bookmark.AddBookmark(name, path) {{{3 +" Class method to add a new bookmark to the list, if a previous bookmark exists +" with the same name, just update the path for that bookmark +function! s:Bookmark.AddBookmark(name, path) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + let i.path = a:path + return + endif + endfor + call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path)) + call s:Bookmark.Sort() +endfunction +" Function: Bookmark.Bookmarks() {{{3 +" Class method to get all bookmarks. Lazily initializes the bookmarks global +" variable +function! s:Bookmark.Bookmarks() + if !exists("g:NERDTreeBookmarks") + let g:NERDTreeBookmarks = [] + endif + return g:NERDTreeBookmarks +endfunction +" Function: Bookmark.BookmarkExistsFor(name) {{{3 +" class method that returns 1 if a bookmark with the given name is found, 0 +" otherwise +function! s:Bookmark.BookmarkExistsFor(name) + try + call s:Bookmark.BookmarkFor(a:name) + return 1 + catch /^NERDTree.BookmarkNotFoundError/ + return 0 + endtry +endfunction +" Function: Bookmark.BookmarkFor(name) {{{3 +" Class method to get the bookmark that has the given name. {} is return if no +" bookmark is found +function! s:Bookmark.BookmarkFor(name) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + return i + endif + endfor + throw "NERDTree.BookmarkNotFoundError: no bookmark found for name: \"". a:name .'"' +endfunction +" Function: Bookmark.BookmarkNames() {{{3 +" Class method to return an array of all bookmark names +function! s:Bookmark.BookmarkNames() + let names = [] + for i in s:Bookmark.Bookmarks() + call add(names, i.name) + endfor + return names +endfunction +" FUNCTION: Bookmark.CacheBookmarks(silent) {{{3 +" Class method to read all bookmarks from the bookmarks file intialize +" bookmark objects for each one. +" +" Args: +" silent - dont echo an error msg if invalid bookmarks are found +function! s:Bookmark.CacheBookmarks(silent) + if filereadable(g:NERDTreeBookmarksFile) + let g:NERDTreeBookmarks = [] + let g:NERDTreeInvalidBookmarks = [] + let bookmarkStrings = readfile(g:NERDTreeBookmarksFile) + let invalidBookmarksFound = 0 + for i in bookmarkStrings + + "ignore blank lines + if i != '' + + let name = substitute(i, '^\(.\{-}\) .*$', '\1', '') + let path = substitute(i, '^.\{-} \(.*\)$', '\1', '') + + try + let bookmark = s:Bookmark.New(name, s:Path.New(path)) + call add(g:NERDTreeBookmarks, bookmark) + catch /^NERDTree.InvalidArgumentsError/ + call add(g:NERDTreeInvalidBookmarks, i) + let invalidBookmarksFound += 1 + endtry + endif + endfor + if invalidBookmarksFound + call s:Bookmark.Write() + if !a:silent + call s:echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.") + endif + endif + call s:Bookmark.Sort() + endif +endfunction +" FUNCTION: Bookmark.compareTo(otherbookmark) {{{3 +" Compare these two bookmarks for sorting purposes +function! s:Bookmark.compareTo(otherbookmark) + return a:otherbookmark.name < self.name +endfunction +" FUNCTION: Bookmark.ClearAll() {{{3 +" Class method to delete all bookmarks. +function! s:Bookmark.ClearAll() + for i in s:Bookmark.Bookmarks() + call i.delete() + endfor + call s:Bookmark.Write() +endfunction +" FUNCTION: Bookmark.delete() {{{3 +" Delete this bookmark. If the node for this bookmark is under the current +" root, then recache bookmarks for its Path object +function! s:Bookmark.delete() + let node = {} + try + let node = self.getNode(1) + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self)) + if !empty(node) + call node.path.cacheDisplayString() + endif + call s:Bookmark.Write() +endfunction +" FUNCTION: Bookmark.getNode(searchFromAbsoluteRoot) {{{3 +" Gets the treenode for this bookmark +" +" Args: +" searchFromAbsoluteRoot: specifies whether we should search from the current +" tree root, or the highest cached node +function! s:Bookmark.getNode(searchFromAbsoluteRoot) + let searchRoot = a:searchFromAbsoluteRoot ? s:TreeDirNode.AbsoluteTreeRoot() : b:NERDTreeRoot + let targetNode = searchRoot.findNode(self.path) + if empty(targetNode) + throw "NERDTree.BookmarkedNodeNotFoundError: no node was found for bookmark: " . self.name + endif + return targetNode +endfunction +" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) {{{3 +" Class method that finds the bookmark with the given name and returns the +" treenode for it. +function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) + let bookmark = s:Bookmark.BookmarkFor(a:name) + return bookmark.getNode(a:searchFromAbsoluteRoot) +endfunction +" FUNCTION: Bookmark.GetSelected() {{{3 +" returns the Bookmark the cursor is over, or {} +function! s:Bookmark.GetSelected() + let line = getline(".") + let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '') + if name != line + try + return s:Bookmark.BookmarkFor(name) + catch /^NERDTree.BookmarkNotFoundError/ + return {} + endtry + endif + return {} +endfunction + +" Function: Bookmark.InvalidBookmarks() {{{3 +" Class method to get all invalid bookmark strings read from the bookmarks +" file +function! s:Bookmark.InvalidBookmarks() + if !exists("g:NERDTreeInvalidBookmarks") + let g:NERDTreeInvalidBookmarks = [] + endif + return g:NERDTreeInvalidBookmarks +endfunction +" FUNCTION: Bookmark.mustExist() {{{3 +function! s:Bookmark.mustExist() + if !self.path.exists() + call s:Bookmark.CacheBookmarks(1) + throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"". + \ self.name ."\" points to a non existing location: \"". self.path.str() + endif +endfunction +" FUNCTION: Bookmark.New(name, path) {{{3 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.New(name, path) + if a:name =~# ' ' + throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name + endif + + let newBookmark = copy(self) + let newBookmark.name = a:name + let newBookmark.path = a:path + return newBookmark +endfunction +" FUNCTION: Bookmark.openInNewTab(options) {{{3 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.openInNewTab(options) + let currentTab = tabpagenr() + if self.path.isDirectory + tabnew + call s:initNerdTree(self.name) + else + exec "tabedit " . self.path.str({'format': 'Edit'}) + endif + + if has_key(a:options, 'stayInCurrentTab') + exec "tabnext " . currentTab + endif +endfunction +" Function: Bookmark.setPath(path) {{{3 +" makes this bookmark point to the given path +function! s:Bookmark.setPath(path) + let self.path = a:path +endfunction +" Function: Bookmark.Sort() {{{3 +" Class method that sorts all bookmarks +function! s:Bookmark.Sort() + let CompareFunc = function("s:compareBookmarks") + call sort(s:Bookmark.Bookmarks(), CompareFunc) +endfunction +" Function: Bookmark.str() {{{3 +" Get the string that should be rendered in the view for this bookmark +function! s:Bookmark.str() + let pathStrMaxLen = winwidth(s:getTreeWinNum()) - 4 - len(self.name) + if &nu + let pathStrMaxLen = pathStrMaxLen - &numberwidth + endif + + let pathStr = self.path.str({'format': 'UI'}) + if len(pathStr) > pathStrMaxLen + let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen) + endif + return '>' . self.name . ' ' . pathStr +endfunction +" FUNCTION: Bookmark.toRoot() {{{3 +" Make the node for this bookmark the new tree root +function! s:Bookmark.toRoot() + if self.validate() + try + let targetNode = self.getNode(1) + catch /^NERDTree.BookmarkedNodeNotFoundError/ + let targetNode = s:TreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path) + endtry + call targetNode.makeRoot() + call s:renderView() + call targetNode.putCursorHere(0, 0) + endif +endfunction +" FUNCTION: Bookmark.ToRoot(name) {{{3 +" Make the node for this bookmark the new tree root +function! s:Bookmark.ToRoot(name) + let bookmark = s:Bookmark.BookmarkFor(a:name) + call bookmark.toRoot() +endfunction + + +"FUNCTION: Bookmark.validate() {{{3 +function! s:Bookmark.validate() + if self.path.exists() + return 1 + else + call s:Bookmark.CacheBookmarks(1) + call s:renderView() + call s:echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.") + return 0 + endif +endfunction + +" Function: Bookmark.Write() {{{3 +" Class method to write all bookmarks to the bookmarks file +function! s:Bookmark.Write() + let bookmarkStrings = [] + for i in s:Bookmark.Bookmarks() + call add(bookmarkStrings, i.name . ' ' . i.path.str()) + endfor + + "add a blank line before the invalid ones + call add(bookmarkStrings, "") + + for j in s:Bookmark.InvalidBookmarks() + call add(bookmarkStrings, j) + endfor + call writefile(bookmarkStrings, g:NERDTreeBookmarksFile) +endfunction +"CLASS: KeyMap {{{2 +"============================================================ +let s:KeyMap = {} +"FUNCTION: KeyMap.All() {{{3 +function! s:KeyMap.All() + if !exists("s:keyMaps") + let s:keyMaps = [] + endif + return s:keyMaps +endfunction + +"FUNCTION: KeyMap.BindAll() {{{3 +function! s:KeyMap.BindAll() + for i in s:KeyMap.All() + call i.bind() + endfor +endfunction + +"FUNCTION: KeyMap.bind() {{{3 +function! s:KeyMap.bind() + exec "nnoremap ". self.key ." :call ". self.callback ."()" +endfunction + +"FUNCTION: KeyMap.Create(options) {{{3 +function! s:KeyMap.Create(options) + let newKeyMap = copy(self) + let newKeyMap.key = a:options['key'] + let newKeyMap.quickhelpText = a:options['quickhelpText'] + let newKeyMap.callback = a:options['callback'] + call add(s:KeyMap.All(), newKeyMap) +endfunction +"CLASS: MenuController {{{2 +"============================================================ +let s:MenuController = {} +"FUNCTION: MenuController.New(menuItems) {{{3 +"create a new menu controller that operates on the given menu items +function! s:MenuController.New(menuItems) + let newMenuController = copy(self) + if a:menuItems[0].isSeparator() + let newMenuController.menuItems = a:menuItems[1:-1] + else + let newMenuController.menuItems = a:menuItems + endif + return newMenuController +endfunction + +"FUNCTION: MenuController.showMenu() {{{3 +"start the main loop of the menu and get the user to choose/execute a menu +"item +function! s:MenuController.showMenu() + call self._saveOptions() + + try + let self.selection = 0 + + let done = 0 + while !done + redraw! + call self._echoPrompt() + let key = nr2char(getchar()) + let done = self._handleKeypress(key) + endwhile + finally + call self._restoreOptions() + endtry + + if self.selection != -1 + let m = self._current() + call m.execute() + endif +endfunction + +"FUNCTION: MenuController._echoPrompt() {{{3 +function! s:MenuController._echoPrompt() + echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated" + echo "==========================================================" + + for i in range(0, len(self.menuItems)-1) + if self.selection == i + echo "> " . self.menuItems[i].text + else + echo " " . self.menuItems[i].text + endif + endfor +endfunction + +"FUNCTION: MenuController._current(key) {{{3 +"get the MenuItem that is currently selected +function! s:MenuController._current() + return self.menuItems[self.selection] +endfunction + +"FUNCTION: MenuController._handleKeypress(key) {{{3 +"change the selection (if appropriate) and return 1 if the user has made +"their choice, 0 otherwise +function! s:MenuController._handleKeypress(key) + if a:key == 'j' + call self._cursorDown() + elseif a:key == 'k' + call self._cursorUp() + elseif a:key == nr2char(27) "escape + let self.selection = -1 + return 1 + elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j + return 1 + else + let index = self._nextIndexFor(a:key) + if index != -1 + let self.selection = index + if len(self._allIndexesFor(a:key)) == 1 + return 1 + endif + endif + endif + + return 0 +endfunction + +"FUNCTION: MenuController._allIndexesFor(shortcut) {{{3 +"get indexes to all menu items with the given shortcut +function! s:MenuController._allIndexesFor(shortcut) + let toReturn = [] + + for i in range(0, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + call add(toReturn, i) + endif + endfor + + return toReturn +endfunction + +"FUNCTION: MenuController._nextIndexFor(shortcut) {{{3 +"get the index to the next menu item with the given shortcut, starts from the +"current cursor location and wraps around to the top again if need be +function! s:MenuController._nextIndexFor(shortcut) + for i in range(self.selection+1, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + for i in range(0, self.selection) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + return -1 +endfunction + +"FUNCTION: MenuController._setCmdheight() {{{3 +"sets &cmdheight to whatever is needed to display the menu +function! s:MenuController._setCmdheight() + let &cmdheight = len(self.menuItems) + 3 +endfunction + +"FUNCTION: MenuController._saveOptions() {{{3 +"set any vim options that are required to make the menu work (saving their old +"values) +function! s:MenuController._saveOptions() + let self._oldLazyredraw = &lazyredraw + let self._oldCmdheight = &cmdheight + set nolazyredraw + call self._setCmdheight() +endfunction + +"FUNCTION: MenuController._restoreOptions() {{{3 +"restore the options we saved in _saveOptions() +function! s:MenuController._restoreOptions() + let &cmdheight = self._oldCmdheight + let &lazyredraw = self._oldLazyredraw +endfunction + +"FUNCTION: MenuController._cursorDown() {{{3 +"move the cursor to the next menu item, skipping separators +function! s:MenuController._cursorDown() + let done = 0 + while !done + if self.selection < len(self.menuItems)-1 + let self.selection += 1 + else + let self.selection = 0 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"FUNCTION: MenuController._cursorUp() {{{3 +"move the cursor to the previous menu item, skipping separators +function! s:MenuController._cursorUp() + let done = 0 + while !done + if self.selection > 0 + let self.selection -= 1 + else + let self.selection = len(self.menuItems)-1 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"CLASS: MenuItem {{{2 +"============================================================ +let s:MenuItem = {} +"FUNCTION: MenuItem.All() {{{3 +"get all top level menu items +function! s:MenuItem.All() + if !exists("s:menuItems") + let s:menuItems = [] + endif + return s:menuItems +endfunction + +"FUNCTION: MenuItem.AllEnabled() {{{3 +"get all top level menu items that are currently enabled +function! s:MenuItem.AllEnabled() + let toReturn = [] + for i in s:MenuItem.All() + if i.enabled() + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: MenuItem.Create(options) {{{3 +"make a new menu item and add it to the global list +function! s:MenuItem.Create(options) + let newMenuItem = copy(self) + + let newMenuItem.text = a:options['text'] + let newMenuItem.shortcut = a:options['shortcut'] + let newMenuItem.children = [] + + let newMenuItem.isActiveCallback = -1 + if has_key(a:options, 'isActiveCallback') + let newMenuItem.isActiveCallback = a:options['isActiveCallback'] + endif + + let newMenuItem.callback = -1 + if has_key(a:options, 'callback') + let newMenuItem.callback = a:options['callback'] + endif + + if has_key(a:options, 'parent') + call add(a:options['parent'].children, newMenuItem) + else + call add(s:MenuItem.All(), newMenuItem) + endif + + return newMenuItem +endfunction + +"FUNCTION: MenuItem.CreateSeparator(options) {{{3 +"make a new separator menu item and add it to the global list +function! s:MenuItem.CreateSeparator(options) + let standard_options = { 'text': '--------------------', + \ 'shortcut': -1, + \ 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.CreateSubmenu(options) {{{3 +"make a new submenu and add it to global list +function! s:MenuItem.CreateSubmenu(options) + let standard_options = { 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.enabled() {{{3 +"return 1 if this menu item should be displayed +" +"delegates off to the isActiveCallback, and defaults to 1 if no callback was +"specified +function! s:MenuItem.enabled() + if self.isActiveCallback != -1 + return {self.isActiveCallback}() + endif + return 1 +endfunction + +"FUNCTION: MenuItem.execute() {{{3 +"perform the action behind this menu item, if this menuitem has children then +"display a new menu for them, otherwise deletegate off to the menuitem's +"callback +function! s:MenuItem.execute() + if len(self.children) + let mc = s:MenuController.New(self.children) + call mc.showMenu() + else + if self.callback != -1 + call {self.callback}() + endif + endif +endfunction + +"FUNCTION: MenuItem.isSeparator() {{{3 +"return 1 if this menuitem is a separator +function! s:MenuItem.isSeparator() + return self.callback == -1 && self.children == [] +endfunction + +"FUNCTION: MenuItem.isSubmenu() {{{3 +"return 1 if this menuitem is a submenu +function! s:MenuItem.isSubmenu() + return self.callback == -1 && !empty(self.children) +endfunction + +"CLASS: TreeFileNode {{{2 +"This class is the parent of the TreeDirNode class and constitures the +"'Component' part of the composite design pattern between the treenode +"classes. +"============================================================ +let s:TreeFileNode = {} +"FUNCTION: TreeFileNode.activate(forceKeepWinOpen) {{{3 +function! s:TreeFileNode.activate(forceKeepWinOpen) + call self.open() + if !a:forceKeepWinOpen + call s:closeTreeIfQuitOnOpen() + end +endfunction +"FUNCTION: TreeFileNode.bookmark(name) {{{3 +"bookmark this node with a:name +function! s:TreeFileNode.bookmark(name) + + "if a bookmark exists with the same name and the node is cached then save + "it so we can update its display string + let oldMarkedNode = {} + try + let oldMarkedNode = s:Bookmark.GetNodeForName(a:name, 1) + catch /^NERDTree.BookmarkNotFoundError/ + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + + call s:Bookmark.AddBookmark(a:name, self.path) + call self.path.cacheDisplayString() + call s:Bookmark.Write() + + if !empty(oldMarkedNode) + call oldMarkedNode.path.cacheDisplayString() + endif +endfunction +"FUNCTION: TreeFileNode.cacheParent() {{{3 +"initializes self.parent if it isnt already +function! s:TreeFileNode.cacheParent() + if empty(self.parent) + let parentPath = self.path.getParent() + if parentPath.equals(self.path) + throw "NERDTree.CannotCacheParentError: already at root" + endif + let self.parent = s:TreeFileNode.New(parentPath) + endif +endfunction +"FUNCTION: TreeFileNode.compareNodes {{{3 +"This is supposed to be a class level method but i cant figure out how to +"get func refs to work from a dict.. +" +"A class level method that compares two nodes +" +"Args: +"n1, n2: the 2 nodes to compare +function! s:compareNodes(n1, n2) + return a:n1.path.compareTo(a:n2.path) +endfunction + +"FUNCTION: TreeFileNode.clearBoomarks() {{{3 +function! s:TreeFileNode.clearBoomarks() + for i in s:Bookmark.Bookmarks() + if i.path.equals(self.path) + call i.delete() + end + endfor + call self.path.cacheDisplayString() +endfunction +"FUNCTION: TreeFileNode.copy(dest) {{{3 +function! s:TreeFileNode.copy(dest) + call self.path.copy(a:dest) + let newPath = s:Path.New(a:dest) + let parent = b:NERDTreeRoot.findNode(newPath.getParent()) + if !empty(parent) + call parent.refresh() + return parent.findNode(newPath) + else + return {} + endif +endfunction + +"FUNCTION: TreeFileNode.delete {{{3 +"Removes this node from the tree and calls the Delete method for its path obj +function! s:TreeFileNode.delete() + call self.path.delete() + call self.parent.removeChild(self) +endfunction + +"FUNCTION: TreeFileNode.displayString() {{{3 +" +"Returns a string that specifies how the node should be represented as a +"string +" +"Return: +"a string that can be used in the view to represent this node +function! s:TreeFileNode.displayString() + return self.path.displayString() +endfunction + +"FUNCTION: TreeFileNode.equals(treenode) {{{3 +" +"Compares this treenode to the input treenode and returns 1 if they are the +"same node. +" +"Use this method instead of == because sometimes when the treenodes contain +"many children, vim seg faults when doing == +" +"Args: +"treenode: the other treenode to compare to +function! s:TreeFileNode.equals(treenode) + return self.path.str() ==# a:treenode.path.str() +endfunction + +"FUNCTION: TreeFileNode.findNode(path) {{{3 +"Returns self if this node.path.Equals the given path. +"Returns {} if not equal. +" +"Args: +"path: the path object to compare against +function! s:TreeFileNode.findNode(path) + if a:path.equals(self.path) + return self + endif + return {} +endfunction +"FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{3 +" +"Finds the next sibling for this node in the indicated direction. This sibling +"must be a directory and may/may not have children as specified. +" +"Args: +"direction: 0 if you want to find the previous sibling, 1 for the next sibling +" +"Return: +"a treenode object or {} if no appropriate sibling could be found +function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) + "if we have no parent then we can have no siblings + if self.parent != {} + let nextSibling = self.findSibling(a:direction) + + while nextSibling != {} + if nextSibling.path.isDirectory && nextSibling.hasVisibleChildren() && nextSibling.isOpen + return nextSibling + endif + let nextSibling = nextSibling.findSibling(a:direction) + endwhile + endif + + return {} +endfunction +"FUNCTION: TreeFileNode.findSibling(direction) {{{3 +" +"Finds the next sibling for this node in the indicated direction +" +"Args: +"direction: 0 if you want to find the previous sibling, 1 for the next sibling +" +"Return: +"a treenode object or {} if no sibling could be found +function! s:TreeFileNode.findSibling(direction) + "if we have no parent then we can have no siblings + if self.parent != {} + + "get the index of this node in its parents children + let siblingIndx = self.parent.getChildIndex(self.path) + + if siblingIndx != -1 + "move a long to the next potential sibling node + let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1 + + "keep moving along to the next sibling till we find one that is valid + let numSiblings = self.parent.getChildCount() + while siblingIndx >= 0 && siblingIndx < numSiblings + + "if the next node is not an ignored node (i.e. wont show up in the + "view) then return it + if self.parent.children[siblingIndx].path.ignore() ==# 0 + return self.parent.children[siblingIndx] + endif + + "go to next node + let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1 + endwhile + endif + endif + + return {} +endfunction + +"FUNCTION: TreeFileNode.getLineNum(){{{3 +"returns the line number this node is rendered on, or -1 if it isnt rendered +function! s:TreeFileNode.getLineNum() + "if the node is the root then return the root line no. + if self.isRoot() + return s:TreeFileNode.GetRootLineNum() + endif + + let totalLines = line("$") + + "the path components we have matched so far + let pathcomponents = [substitute(b:NERDTreeRoot.path.str({'format': 'UI'}), '/ *$', '', '')] + "the index of the component we are searching for + let curPathComponent = 1 + + let fullpath = self.path.str({'format': 'UI'}) + + + let lnum = s:TreeFileNode.GetRootLineNum() + while lnum > 0 + let lnum = lnum + 1 + "have we reached the bottom of the tree? + if lnum ==# totalLines+1 + return -1 + endif + + let curLine = getline(lnum) + + let indent = s:indentLevelFor(curLine) + if indent ==# curPathComponent + let curLine = s:stripMarkupFromLine(curLine, 1) + + let curPath = join(pathcomponents, '/') . '/' . curLine + if stridx(fullpath, curPath, 0) ==# 0 + if fullpath ==# curPath || strpart(fullpath, len(curPath)-1,1) ==# '/' + let curLine = substitute(curLine, '/ *$', '', '') + call add(pathcomponents, curLine) + let curPathComponent = curPathComponent + 1 + + if fullpath ==# curPath + return lnum + endif + endif + endif + endif + endwhile + return -1 +endfunction + +"FUNCTION: TreeFileNode.GetRootForTab(){{{3 +"get the root node for this tab +function! s:TreeFileNode.GetRootForTab() + if s:treeExistsForTab() + return getbufvar(t:NERDTreeBufName, 'NERDTreeRoot') + end + return {} +endfunction +"FUNCTION: TreeFileNode.GetRootLineNum(){{{3 +"gets the line number of the root node +function! s:TreeFileNode.GetRootLineNum() + let rootLine = 1 + while getline(rootLine) !~# '^\(/\|<\)' + let rootLine = rootLine + 1 + endwhile + return rootLine +endfunction + +"FUNCTION: TreeFileNode.GetSelected() {{{3 +"gets the treenode that the cursor is currently over +function! s:TreeFileNode.GetSelected() + try + let path = s:getPath(line(".")) + if path ==# {} + return {} + endif + return b:NERDTreeRoot.findNode(path) + catch /NERDTree/ + return {} + endtry +endfunction +"FUNCTION: TreeFileNode.isVisible() {{{3 +"returns 1 if this node should be visible according to the tree filters and +"hidden file filters (and their on/off status) +function! s:TreeFileNode.isVisible() + return !self.path.ignore() +endfunction +"FUNCTION: TreeFileNode.isRoot() {{{3 +"returns 1 if this node is b:NERDTreeRoot +function! s:TreeFileNode.isRoot() + if !s:treeExistsForBuf() + throw "NERDTree.NoTreeError: No tree exists for the current buffer" + endif + + return self.equals(b:NERDTreeRoot) +endfunction + +"FUNCTION: TreeFileNode.makeRoot() {{{3 +"Make this node the root of the tree +function! s:TreeFileNode.makeRoot() + if self.path.isDirectory + let b:NERDTreeRoot = self + else + call self.cacheParent() + let b:NERDTreeRoot = self.parent + endif + + call b:NERDTreeRoot.open() + + "change dir to the dir of the new root if instructed to + if g:NERDTreeChDirMode ==# 2 + exec "cd " . b:NERDTreeRoot.path.str({'format': 'Edit'}) + endif +endfunction +"FUNCTION: TreeFileNode.New(path) {{{3 +"Returns a new TreeNode object with the given path and parent +" +"Args: +"path: a path object representing the full filesystem path to the file/dir that the node represents +function! s:TreeFileNode.New(path) + if a:path.isDirectory + return s:TreeDirNode.New(a:path) + else + let newTreeNode = copy(self) + let newTreeNode.path = a:path + let newTreeNode.parent = {} + return newTreeNode + endif +endfunction + +"FUNCTION: TreeFileNode.open() {{{3 +"Open the file represented by the given node in the current window, splitting +"the window if needed +" +"ARGS: +"treenode: file node to open +function! s:TreeFileNode.open() + if b:NERDTreeType ==# "secondary" + exec 'edit ' . self.path.str({'format': 'Edit'}) + return + endif + + "if the file is already open in this tab then just stick the cursor in it + let winnr = bufwinnr('^' . self.path.str() . '$') + if winnr != -1 + call s:exec(winnr . "wincmd w") + + else + if !s:isWindowUsable(winnr("#")) && s:firstUsableWindow() ==# -1 + call self.openSplit() + else + try + if !s:isWindowUsable(winnr("#")) + call s:exec(s:firstUsableWindow() . "wincmd w") + else + call s:exec('wincmd p') + endif + exec ("edit " . self.path.str({'format': 'Edit'})) + catch /^Vim\%((\a\+)\)\=:E37/ + call s:putCursorInTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + echo v:exception + endtry + endif + endif +endfunction +"FUNCTION: TreeFileNode.openSplit() {{{3 +"Open this node in a new window +function! s:TreeFileNode.openSplit() + + if b:NERDTreeType ==# "secondary" + exec "split " . self.path.str({'format': 'Edit'}) + return + endif + + " Save the user's settings for splitbelow and splitright + let savesplitbelow=&splitbelow + let savesplitright=&splitright + + " 'there' will be set to a command to move from the split window + " back to the explorer window + " + " 'back' will be set to a command to move from the explorer window + " back to the newly split window + " + " 'right' and 'below' will be set to the settings needed for + " splitbelow and splitright IF the explorer is the only window. + " + let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l" + let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h" + let right= g:NERDTreeWinPos ==# "left" + let below=0 + + " Attempt to go to adjacent window + call s:exec(back) + + let onlyOneWin = (winnr("$") ==# 1) + + " If no adjacent window, set splitright and splitbelow appropriately + if onlyOneWin + let &splitright=right + let &splitbelow=below + else + " found adjacent window - invert split direction + let &splitright=!right + let &splitbelow=!below + endif + + let splitMode = onlyOneWin ? "vertical" : "" + + " Open the new window + try + exec(splitMode." sp " . self.path.str({'format': 'Edit'})) + catch /^Vim\%((\a\+)\)\=:E37/ + call s:putCursorInTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + "do nothing + endtry + + "resize the tree window if no other window was open before + if onlyOneWin + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + call s:exec(there) + exec("silent ". splitMode ." resize ". size) + call s:exec('wincmd p') + endif + + " Restore splitmode settings + let &splitbelow=savesplitbelow + let &splitright=savesplitright +endfunction +"FUNCTION: TreeFileNode.openVSplit() {{{3 +"Open this node in a new vertical window +function! s:TreeFileNode.openVSplit() + if b:NERDTreeType ==# "secondary" + exec "vnew " . self.path.str({'format': 'Edit'}) + return + endif + + let winwidth = winwidth(".") + if winnr("$")==#1 + let winwidth = g:NERDTreeWinSize + endif + + call s:exec("wincmd p") + exec "vnew " . self.path.str({'format': 'Edit'}) + + "resize the nerd tree back to the original size + call s:putCursorInTreeWin() + exec("silent vertical resize ". winwidth) + call s:exec('wincmd p') +endfunction +"FUNCTION: TreeFileNode.openInNewTab(options) {{{3 +function! s:TreeFileNode.openInNewTab(options) + let currentTab = tabpagenr() + + if !has_key(a:options, 'keepTreeOpen') + call s:closeTreeIfQuitOnOpen() + endif + + exec "tabedit " . self.path.str({'format': 'Edit'}) + + if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab'] + exec "tabnext " . currentTab + endif + +endfunction +"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{3 +"Places the cursor on the line number this node is rendered on +" +"Args: +"isJump: 1 if this cursor movement should be counted as a jump by vim +"recurseUpward: try to put the cursor on the parent if the this node isnt +"visible +function! s:TreeFileNode.putCursorHere(isJump, recurseUpward) + let ln = self.getLineNum() + if ln != -1 + if a:isJump + mark ' + endif + call cursor(ln, col(".")) + else + if a:recurseUpward + let node = self + while node != {} && node.getLineNum() ==# -1 + let node = node.parent + call node.open() + endwhile + call s:renderView() + call node.putCursorHere(a:isJump, 0) + endif + endif +endfunction + +"FUNCTION: TreeFileNode.refresh() {{{3 +function! s:TreeFileNode.refresh() + call self.path.refresh() +endfunction +"FUNCTION: TreeFileNode.rename() {{{3 +"Calls the rename method for this nodes path obj +function! s:TreeFileNode.rename(newName) + let newName = substitute(a:newName, '\(\\\|\/\)$', '', '') + call self.path.rename(newName) + call self.parent.removeChild(self) + + let parentPath = self.path.getParent() + let newParent = b:NERDTreeRoot.findNode(parentPath) + + if newParent != {} + call newParent.createChild(self.path, 1) + call newParent.refresh() + endif +endfunction +"FUNCTION: TreeFileNode.renderToString {{{3 +"returns a string representation for this tree to be rendered in the view +function! s:TreeFileNode.renderToString() + return self._renderToString(0, 0, [], self.getChildCount() ==# 1) +endfunction + + +"Args: +"depth: the current depth in the tree for this call +"drawText: 1 if we should actually draw the line for this node (if 0 then the +"child nodes are rendered only) +"vertMap: a binary array that indicates whether a vertical bar should be draw +"for each depth in the tree +"isLastChild:true if this curNode is the last child of its parent +function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) + let output = "" + if a:drawText ==# 1 + + let treeParts = '' + + "get all the leading spaces and vertical tree parts for this line + if a:depth > 1 + for j in a:vertMap[0:-2] + if g:NERDTreeDirArrows + let treeParts = treeParts . ' ' + else + if j ==# 1 + let treeParts = treeParts . '| ' + else + let treeParts = treeParts . ' ' + endif + endif + endfor + endif + + "get the last vertical tree part for this line which will be different + "if this node is the last child of its parent + if !g:NERDTreeDirArrows + if a:isLastChild + let treeParts = treeParts . '`' + else + let treeParts = treeParts . '|' + endif + endif + + "smack the appropriate dir/file symbol on the line before the file/dir + "name itself + if self.path.isDirectory + if self.isOpen + if g:NERDTreeDirArrows + let treeParts = treeParts . '▾ ' + else + let treeParts = treeParts . '~' + endif + else + if g:NERDTreeDirArrows + let treeParts = treeParts . '▸ ' + else + let treeParts = treeParts . '+' + endif + endif + else + if g:NERDTreeDirArrows + let treeParts = treeParts . ' ' + else + let treeParts = treeParts . '-' + endif + endif + let line = treeParts . self.displayString() + + let output = output . line . "\n" + endif + + "if the node is an open dir, draw its children + if self.path.isDirectory ==# 1 && self.isOpen ==# 1 + + let childNodesToDraw = self.getVisibleChildren() + if len(childNodesToDraw) > 0 + + "draw all the nodes children except the last + let lastIndx = len(childNodesToDraw)-1 + if lastIndx > 0 + for i in childNodesToDraw[0:lastIndx-1] + let output = output . i._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 1), 0) + endfor + endif + + "draw the last child, indicating that it IS the last + let output = output . childNodesToDraw[lastIndx]._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 0), 1) + endif + endif + + return output +endfunction +"CLASS: TreeDirNode {{{2 +"This class is a child of the TreeFileNode class and constitutes the +"'Composite' part of the composite design pattern between the treenode +"classes. +"============================================================ +let s:TreeDirNode = copy(s:TreeFileNode) +"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{3 +"class method that returns the highest cached ancestor of the current root +function! s:TreeDirNode.AbsoluteTreeRoot() + let currentNode = b:NERDTreeRoot + while currentNode.parent != {} + let currentNode = currentNode.parent + endwhile + return currentNode +endfunction +"FUNCTION: TreeDirNode.activate(forceKeepWinOpen) {{{3 +unlet s:TreeDirNode.activate +function! s:TreeDirNode.activate(forceKeepWinOpen) + call self.toggleOpen() + call s:renderView() + call self.putCursorHere(0, 0) +endfunction +"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{3 +"Adds the given treenode to the list of children for this node +" +"Args: +"-treenode: the node to add +"-inOrder: 1 if the new node should be inserted in sorted order +function! s:TreeDirNode.addChild(treenode, inOrder) + call add(self.children, a:treenode) + let a:treenode.parent = self + + if a:inOrder + call self.sortChildren() + endif +endfunction + +"FUNCTION: TreeDirNode.close() {{{3 +"Closes this directory +function! s:TreeDirNode.close() + let self.isOpen = 0 +endfunction + +"FUNCTION: TreeDirNode.closeChildren() {{{3 +"Closes all the child dir nodes of this node +function! s:TreeDirNode.closeChildren() + for i in self.children + if i.path.isDirectory + call i.close() + call i.closeChildren() + endif + endfor +endfunction + +"FUNCTION: TreeDirNode.createChild(path, inOrder) {{{3 +"Instantiates a new child node for this node with the given path. The new +"nodes parent is set to this node. +" +"Args: +"path: a Path object that this node will represent/contain +"inOrder: 1 if the new node should be inserted in sorted order +" +"Returns: +"the newly created node +function! s:TreeDirNode.createChild(path, inOrder) + let newTreeNode = s:TreeFileNode.New(a:path) + call self.addChild(newTreeNode, a:inOrder) + return newTreeNode +endfunction + +"FUNCTION: TreeDirNode.findNode(path) {{{3 +"Will find one of the children (recursively) that has the given path +" +"Args: +"path: a path object +unlet s:TreeDirNode.findNode +function! s:TreeDirNode.findNode(path) + if a:path.equals(self.path) + return self + endif + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + if self.path.isDirectory + for i in self.children + let retVal = i.findNode(a:path) + if retVal != {} + return retVal + endif + endfor + endif + return {} +endfunction +"FUNCTION: TreeDirNode.getChildCount() {{{3 +"Returns the number of children this node has +function! s:TreeDirNode.getChildCount() + return len(self.children) +endfunction + +"FUNCTION: TreeDirNode.getChild(path) {{{3 +"Returns child node of this node that has the given path or {} if no such node +"exists. +" +"This function doesnt not recurse into child dir nodes +" +"Args: +"path: a path object +function! s:TreeDirNode.getChild(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + let index = self.getChildIndex(a:path) + if index ==# -1 + return {} + else + return self.children[index] + endif + +endfunction + +"FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{3 +"returns the child at the given index +"Args: +"indx: the index to get the child from +"visible: 1 if only the visible children array should be used, 0 if all the +"children should be searched. +function! s:TreeDirNode.getChildByIndex(indx, visible) + let array_to_search = a:visible? self.getVisibleChildren() : self.children + if a:indx > len(array_to_search) + throw "NERDTree.InvalidArgumentsError: Index is out of bounds." + endif + return array_to_search[a:indx] +endfunction + +"FUNCTION: TreeDirNode.getChildIndex(path) {{{3 +"Returns the index of the child node of this node that has the given path or +"-1 if no such node exists. +" +"This function doesnt not recurse into child dir nodes +" +"Args: +"path: a path object +function! s:TreeDirNode.getChildIndex(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return -1 + endif + + "do a binary search for the child + let a = 0 + let z = self.getChildCount() + while a < z + let mid = (a+z)/2 + let diff = a:path.compareTo(self.children[mid].path) + + if diff ==# -1 + let z = mid + elseif diff ==# 1 + let a = mid+1 + else + return mid + endif + endwhile + return -1 +endfunction + +"FUNCTION: TreeDirNode.GetSelected() {{{3 +"Returns the current node if it is a dir node, or else returns the current +"nodes parent +unlet s:TreeDirNode.GetSelected +function! s:TreeDirNode.GetSelected() + let currentDir = s:TreeFileNode.GetSelected() + if currentDir != {} && !currentDir.isRoot() + if currentDir.path.isDirectory ==# 0 + let currentDir = currentDir.parent + endif + endif + return currentDir +endfunction +"FUNCTION: TreeDirNode.getVisibleChildCount() {{{3 +"Returns the number of visible children this node has +function! s:TreeDirNode.getVisibleChildCount() + return len(self.getVisibleChildren()) +endfunction + +"FUNCTION: TreeDirNode.getVisibleChildren() {{{3 +"Returns a list of children to display for this node, in the correct order +" +"Return: +"an array of treenodes +function! s:TreeDirNode.getVisibleChildren() + let toReturn = [] + for i in self.children + if i.path.ignore() ==# 0 + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: TreeDirNode.hasVisibleChildren() {{{3 +"returns 1 if this node has any childre, 0 otherwise.. +function! s:TreeDirNode.hasVisibleChildren() + return self.getVisibleChildCount() != 0 +endfunction + +"FUNCTION: TreeDirNode._initChildren() {{{3 +"Removes all childen from this node and re-reads them +" +"Args: +"silent: 1 if the function should not echo any "please wait" messages for +"large directories +" +"Return: the number of child nodes read +function! s:TreeDirNode._initChildren(silent) + "remove all the current child nodes + let self.children = [] + + "get an array of all the files in the nodes dir + let dir = self.path + let globDir = dir.str({'format': 'Glob'}) + let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*') + let files = split(filesStr, "\n") + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call s:echo("Please wait, caching a large dir ...") + endif + + let invalidFilesFound = 0 + for i in files + + "filter out the .. and . directories + "Note: we must match .. AND ../ cos sometimes the globpath returns + "../ for path with strange chars (eg $) + if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + + "put the next file in a new node and attach it + try + let path = s:Path.New(i) + call self.createChild(path, 0) + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound += 1 + endtry + endif + endfor + + call self.sortChildren() + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call s:echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).") + endif + + if invalidFilesFound + call s:echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree") + endif + return self.getChildCount() +endfunction +"FUNCTION: TreeDirNode.New(path) {{{3 +"Returns a new TreeNode object with the given path and parent +" +"Args: +"path: a path object representing the full filesystem path to the file/dir that the node represents +unlet s:TreeDirNode.New +function! s:TreeDirNode.New(path) + if a:path.isDirectory != 1 + throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object." + endif + + let newTreeNode = copy(self) + let newTreeNode.path = a:path + + let newTreeNode.isOpen = 0 + let newTreeNode.children = [] + + let newTreeNode.parent = {} + + return newTreeNode +endfunction +"FUNCTION: TreeDirNode.open() {{{3 +"Reads in all this nodes children +" +"Return: the number of child nodes read +unlet s:TreeDirNode.open +function! s:TreeDirNode.open() + let self.isOpen = 1 + if self.children ==# [] + return self._initChildren(0) + else + return 0 + endif +endfunction + +" FUNCTION: TreeDirNode.openExplorer() {{{3 +" opens an explorer window for this node in the previous window (could be a +" nerd tree or a netrw) +function! s:TreeDirNode.openExplorer() + let oldwin = winnr() + call s:exec('wincmd p') + if oldwin ==# winnr() || (&modified && s:bufInWindows(winbufnr(winnr())) < 2) + call s:exec('wincmd p') + call self.openSplit() + else + exec ("silent edit " . self.path.str({'format': 'Edit'})) + endif +endfunction +"FUNCTION: TreeDirNode.openInNewTab(options) {{{3 +unlet s:TreeDirNode.openInNewTab +function! s:TreeDirNode.openInNewTab(options) + let currentTab = tabpagenr() + + if !has_key(a:options, 'keepTreeOpen') || !a:options['keepTreeOpen'] + call s:closeTreeIfQuitOnOpen() + endif + + tabnew + call s:initNerdTree(self.path.str()) + + if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab'] + exec "tabnext " . currentTab + endif +endfunction +"FUNCTION: TreeDirNode.openRecursively() {{{3 +"Opens this treenode and all of its children whose paths arent 'ignored' +"because of the file filters. +" +"This method is actually a wrapper for the OpenRecursively2 method which does +"the work. +function! s:TreeDirNode.openRecursively() + call self._openRecursively2(1) +endfunction + +"FUNCTION: TreeDirNode._openRecursively2() {{{3 +"Opens this all children of this treenode recursively if either: +" *they arent filtered by file filters +" *a:forceOpen is 1 +" +"Args: +"forceOpen: 1 if this node should be opened regardless of file filters +function! s:TreeDirNode._openRecursively2(forceOpen) + if self.path.ignore() ==# 0 || a:forceOpen + let self.isOpen = 1 + if self.children ==# [] + call self._initChildren(1) + endif + + for i in self.children + if i.path.isDirectory ==# 1 + call i._openRecursively2(0) + endif + endfor + endif +endfunction + +"FUNCTION: TreeDirNode.refresh() {{{3 +unlet s:TreeDirNode.refresh +function! s:TreeDirNode.refresh() + call self.path.refresh() + + "if this node was ever opened, refresh its children + if self.isOpen || !empty(self.children) + "go thru all the files/dirs under this node + let newChildNodes = [] + let invalidFilesFound = 0 + let dir = self.path + let globDir = dir.str({'format': 'Glob'}) + let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*') + let files = split(filesStr, "\n") + for i in files + "filter out the .. and . directories + "Note: we must match .. AND ../ cos sometimes the globpath returns + "../ for path with strange chars (eg $) + if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + + try + "create a new path and see if it exists in this nodes children + let path = s:Path.New(i) + let newNode = self.getChild(path) + if newNode != {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = s:TreeFileNode.New(path) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + + + catch /^NERDTree.InvalidArgumentsError/ + let invalidFilesFound = 1 + endtry + endif + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call s:echoWarning("some files could not be loaded into the NERD tree") + endif + endif +endfunction + +"FUNCTION: TreeDirNode.reveal(path) {{{3 +"reveal the given path, i.e. cache and open all treenodes needed to display it +"in the UI +function! s:TreeDirNode.reveal(path) + if !a:path.isUnder(self.path) + throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str() + endif + + call self.open() + + if self.path.equals(a:path.getParent()) + let n = self.findNode(a:path) + call s:renderView() + call n.putCursorHere(1,0) + return + endif + + let p = a:path + while !p.getParent().equals(self.path) + let p = p.getParent() + endwhile + + let n = self.findNode(p) + call n.reveal(a:path) +endfunction +"FUNCTION: TreeDirNode.removeChild(treenode) {{{3 +" +"Removes the given treenode from this nodes set of children +" +"Args: +"treenode: the node to remove +" +"Throws a NERDTree.ChildNotFoundError if the given treenode is not found +function! s:TreeDirNode.removeChild(treenode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:treenode) + call remove(self.children, i) + return + endif + endfor + + throw "NERDTree.ChildNotFoundError: child node was not found" +endfunction + +"FUNCTION: TreeDirNode.sortChildren() {{{3 +" +"Sorts the children of this node according to alphabetical order and the +"directory priority. +" +function! s:TreeDirNode.sortChildren() + let CompareFunc = function("s:compareNodes") + call sort(self.children, CompareFunc) +endfunction + +"FUNCTION: TreeDirNode.toggleOpen() {{{3 +"Opens this directory if it is closed and vice versa +function! s:TreeDirNode.toggleOpen() + if self.isOpen ==# 1 + call self.close() + else + call self.open() + endif +endfunction + +"FUNCTION: TreeDirNode.transplantChild(newNode) {{{3 +"Replaces the child of this with the given node (where the child node's full +"path matches a:newNode's fullpath). The search for the matching node is +"non-recursive +" +"Arg: +"newNode: the node to graft into the tree +function! s:TreeDirNode.transplantChild(newNode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:newNode) + let self.children[i] = a:newNode + let a:newNode.parent = self + break + endif + endfor +endfunction +"============================================================ +"CLASS: Path {{{2 +"============================================================ +let s:Path = {} +"FUNCTION: Path.AbsolutePathFor(str) {{{3 +function! s:Path.AbsolutePathFor(str) + let prependCWD = 0 + if s:running_windows + let prependCWD = a:str !~# '^.:\(\\\|\/\)' + else + let prependCWD = a:str !~# '^/' + endif + + let toReturn = a:str + if prependCWD + let toReturn = getcwd() . s:Path.Slash() . a:str + endif + + return toReturn +endfunction +"FUNCTION: Path.bookmarkNames() {{{3 +function! s:Path.bookmarkNames() + if !exists("self._bookmarkNames") + call self.cacheDisplayString() + endif + return self._bookmarkNames +endfunction +"FUNCTION: Path.cacheDisplayString() {{{3 +function! s:Path.cacheDisplayString() + let self.cachedDisplayString = self.getLastPathComponent(1) + + if self.isExecutable + let self.cachedDisplayString = self.cachedDisplayString . '*' + endif + + let self._bookmarkNames = [] + for i in s:Bookmark.Bookmarks() + if i.path.equals(self) + call add(self._bookmarkNames, i.name) + endif + endfor + if !empty(self._bookmarkNames) + let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}' + endif + + if self.isSymLink + let self.cachedDisplayString .= ' -> ' . self.symLinkDest + endif + + if self.isReadOnly + let self.cachedDisplayString .= ' [RO]' + endif +endfunction +"FUNCTION: Path.changeToDir() {{{3 +function! s:Path.changeToDir() + let dir = self.str({'format': 'Cd'}) + if self.isDirectory ==# 0 + let dir = self.getParent().str({'format': 'Cd'}) + endif + + try + execute "cd " . dir + call s:echo("CWD is now: " . getcwd()) + catch + throw "NERDTree.PathChangeError: cannot change CWD to " . dir + endtry +endfunction + +"FUNCTION: Path.compareTo() {{{3 +" +"Compares this Path to the given path and returns 0 if they are equal, -1 if +"this Path is "less than" the given path, or 1 if it is "greater". +" +"Args: +"path: the path object to compare this to +" +"Return: +"1, -1 or 0 +function! s:Path.compareTo(path) + let thisPath = self.getLastPathComponent(1) + let thatPath = a:path.getLastPathComponent(1) + + "if the paths are the same then clearly we return 0 + if thisPath ==# thatPath + return 0 + endif + + let thisSS = self.getSortOrderIndex() + let thatSS = a:path.getSortOrderIndex() + + "compare the sort sequences, if they are different then the return + "value is easy + if thisSS < thatSS + return -1 + elseif thisSS > thatSS + return 1 + else + "if the sort sequences are the same then compare the paths + "alphabetically + let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath limit + let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1) + endif + endif + + return toReturn +endfunction + +"FUNCTION: Path._strForUI() {{{3 +function! s:Path._strForUI() + let toReturn = '/' . join(self.pathSegments, '/') + if self.isDirectory && toReturn != '/' + let toReturn = toReturn . '/' + endif + return toReturn +endfunction + +"FUNCTION: Path._strForCd() {{{3 +" +" returns a string that can be used with :cd +function! s:Path._strForCd() + return escape(self.str(), s:escape_chars) +endfunction +"FUNCTION: Path._strForEdit() {{{3 +" +"Return: the string for this path that is suitable to be used with the :edit +"command +function! s:Path._strForEdit() + let p = self.str({'format': 'UI'}) + let cwd = getcwd() + + if s:running_windows + let p = tolower(self.str()) + let cwd = tolower(getcwd()) + endif + + let p = escape(p, s:escape_chars) + + let cwd = cwd . s:Path.Slash() + + "return a relative path if we can + if stridx(p, cwd) ==# 0 + let p = strpart(p, strlen(cwd)) + endif + + if p ==# '' + let p = '.' + endif + + return p + +endfunction +"FUNCTION: Path._strForGlob() {{{3 +function! s:Path._strForGlob() + let lead = s:Path.Slash() + + "if we are running windows then slap a drive letter on the front + if s:running_windows + let lead = self.drive . '\' + endif + + let toReturn = lead . join(self.pathSegments, s:Path.Slash()) + + if !s:running_windows + let toReturn = escape(toReturn, s:escape_chars) + endif + return toReturn +endfunction +"FUNCTION: Path._str() {{{3 +" +"Gets the string path for this path object that is appropriate for the OS. +"EG, in windows c:\foo\bar +" in *nix /foo/bar +function! s:Path._str() + let lead = s:Path.Slash() + + "if we are running windows then slap a drive letter on the front + if s:running_windows + let lead = self.drive . '\' + endif + + return lead . join(self.pathSegments, s:Path.Slash()) +endfunction + +"FUNCTION: Path.strTrunk() {{{3 +"Gets the path without the last segment on the end. +function! s:Path.strTrunk() + return self.drive . '/' . join(self.pathSegments[0:-2], '/') +endfunction + +"FUNCTION: Path.WinToUnixPath(pathstr){{{3 +"Takes in a windows path and returns the unix equiv +" +"A class level method +" +"Args: +"pathstr: the windows path to convert +function! s:Path.WinToUnixPath(pathstr) + if !s:running_windows + return a:pathstr + endif + + let toReturn = a:pathstr + + "remove the x:\ of the front + let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "") + + "convert all \ chars to / + let toReturn = substitute(toReturn, '\', '/', "g") + + return toReturn +endfunction + +" SECTION: General Functions {{{1 +"============================================================ +"FUNCTION: s:bufInWindows(bnum){{{2 +"[[STOLEN FROM VTREEEXPLORER.VIM]] +"Determine the number of windows open to this buffer number. +"Care of Yegappan Lakshman. Thanks! +" +"Args: +"bnum: the subject buffers buffer number +function! s:bufInWindows(bnum) + let cnt = 0 + let winnum = 1 + while 1 + let bufnum = winbufnr(winnum) + if bufnum < 0 + break + endif + if bufnum ==# a:bnum + let cnt = cnt + 1 + endif + let winnum = winnum + 1 + endwhile + + return cnt +endfunction " >>> +"FUNCTION: s:checkForBrowse(dir) {{{2 +"inits a secondary nerd tree in the current buffer if appropriate +function! s:checkForBrowse(dir) + if a:dir != '' && isdirectory(a:dir) + call s:initNerdTreeInPlace(a:dir) + endif +endfunction +"FUNCTION: s:compareBookmarks(first, second) {{{2 +"Compares two bookmarks +function! s:compareBookmarks(first, second) + return a:first.compareTo(a:second) +endfunction + +" FUNCTION: s:completeBookmarks(A,L,P) {{{2 +" completion function for the bookmark commands +function! s:completeBookmarks(A,L,P) + return filter(s:Bookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"') +endfunction +" FUNCTION: s:exec(cmd) {{{2 +" same as :exec cmd but eventignore=all is set for the duration +function! s:exec(cmd) + let old_ei = &ei + set ei=all + exec a:cmd + let &ei = old_ei +endfunction +" FUNCTION: s:findAndRevealPath() {{{2 +function! s:findAndRevealPath() + try + let p = s:Path.New(expand("%:p")) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("no file for the current buffer") + return + endtry + + if !s:treeExistsForTab() + try + let cwd = s:Path.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("current directory does not exist.") + let cwd = p.getParent() + endtry + + if p.isUnder(cwd) + call s:initNerdTree(cwd.str()) + else + call s:initNerdTree(p.getParent().str()) + endif + else + if !p.isUnder(s:TreeFileNode.GetRootForTab().path) + call s:initNerdTree(p.getParent().str()) + else + if !s:isTreeOpen() + call s:toggle("") + endif + endif + endif + call s:putCursorInTreeWin() + call b:NERDTreeRoot.reveal(p) +endfunction +"FUNCTION: s:initNerdTree(name) {{{2 +"Initialise the nerd tree for this tab. The tree will start in either the +"given directory, or the directory associated with the given bookmark +" +"Args: +"name: the name of a bookmark or a directory +function! s:initNerdTree(name) + let path = {} + if s:Bookmark.BookmarkExistsFor(a:name) + let path = s:Bookmark.BookmarkFor(a:name).path + else + let dir = a:name ==# '' ? getcwd() : a:name + + "hack to get an absolute path if a relative path is given + if dir =~# '^\.' + let dir = getcwd() . s:Path.Slash() . dir + endif + let dir = resolve(dir) + + try + let path = s:Path.New(dir) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("No bookmark or directory found for: " . a:name) + return + endtry + endif + if !path.isDirectory + let path = path.getParent() + endif + + "if instructed to, then change the vim CWD to the dir the NERDTree is + "inited in + if g:NERDTreeChDirMode != 0 + call path.changeToDir() + endif + + if s:treeExistsForTab() + if s:isTreeOpen() + call s:closeTree() + endif + unlet t:NERDTreeBufName + endif + + let newRoot = s:TreeDirNode.New(path) + call newRoot.open() + + call s:createTreeWin() + let b:treeShowHelp = 0 + let b:NERDTreeIgnoreEnabled = 1 + let b:NERDTreeShowFiles = g:NERDTreeShowFiles + let b:NERDTreeShowHidden = g:NERDTreeShowHidden + let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks + let b:NERDTreeRoot = newRoot + + let b:NERDTreeType = "primary" + + call s:renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) +endfunction + +"FUNCTION: s:initNerdTreeInPlace(dir) {{{2 +function! s:initNerdTreeInPlace(dir) + try + let path = s:Path.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("Invalid directory name:" . a:name) + return + endtry + + "we want the directory buffer to disappear when we do the :edit below + setlocal bufhidden=wipe + + let previousBuf = expand("#") + + "we need a unique name for each secondary tree buffer to ensure they are + "all independent + exec "silent edit " . s:nextBufferName() + + let b:NERDTreePreviousBuf = bufnr(previousBuf) + + let b:NERDTreeRoot = s:TreeDirNode.New(path) + call b:NERDTreeRoot.open() + + call s:setCommonBufOptions() + let b:NERDTreeType = "secondary" + + call s:renderView() +endfunction +" FUNCTION: s:initNerdTreeMirror() {{{2 +function! s:initNerdTreeMirror() + + "get the names off all the nerd tree buffers + let treeBufNames = [] + for i in range(1, tabpagenr("$")) + let nextName = s:tabpagevar(i, 'NERDTreeBufName') + if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName) + call add(treeBufNames, nextName) + endif + endfor + let treeBufNames = s:unique(treeBufNames) + + "map the option names (that the user will be prompted with) to the nerd + "tree buffer names + let options = {} + let i = 0 + while i < len(treeBufNames) + let bufName = treeBufNames[i] + let treeRoot = getbufvar(bufName, "NERDTreeRoot") + let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName + let i = i + 1 + endwhile + + "work out which tree to mirror, if there is more than 1 then ask the user + let bufferName = '' + if len(keys(options)) > 1 + let choices = ["Choose a tree to mirror"] + let choices = extend(choices, sort(keys(options))) + let choice = inputlist(choices) + if choice < 1 || choice > len(options) || choice ==# '' + return + endif + + let bufferName = options[sort(keys(options))[choice-1]] + elseif len(keys(options)) ==# 1 + let bufferName = values(options)[0] + else + call s:echo("No trees to mirror") + return + endif + + if s:treeExistsForTab() && s:isTreeOpen() + call s:closeTree() + endif + + let t:NERDTreeBufName = bufferName + call s:createTreeWin() + exec 'buffer ' . bufferName + if !&hidden + call s:renderView() + endif +endfunction +" FUNCTION: s:nextBufferName() {{{2 +" returns the buffer name for the next nerd tree +function! s:nextBufferName() + let name = s:NERDTreeBufName . s:next_buffer_number + let s:next_buffer_number += 1 + return name +endfunction +" FUNCTION: s:tabpagevar(tabnr, var) {{{2 +function! s:tabpagevar(tabnr, var) + let currentTab = tabpagenr() + let old_ei = &ei + set ei=all + + exec "tabnext " . a:tabnr + let v = -1 + if exists('t:' . a:var) + exec 'let v = t:' . a:var + endif + exec "tabnext " . currentTab + + let &ei = old_ei + + return v +endfunction +" Function: s:treeExistsForBuffer() {{{2 +" Returns 1 if a nerd tree root exists in the current buffer +function! s:treeExistsForBuf() + return exists("b:NERDTreeRoot") +endfunction +" Function: s:treeExistsForTab() {{{2 +" Returns 1 if a nerd tree root exists in the current tab +function! s:treeExistsForTab() + return exists("t:NERDTreeBufName") +endfunction +" Function: s:unique(list) {{{2 +" returns a:list without duplicates +function! s:unique(list) + let uniqlist = [] + for elem in a:list + if index(uniqlist, elem) ==# -1 + let uniqlist += [elem] + endif + endfor + return uniqlist +endfunction +" SECTION: Public API {{{1 +"============================================================ +let g:NERDTreePath = s:Path +let g:NERDTreeDirNode = s:TreeDirNode +let g:NERDTreeFileNode = s:TreeFileNode +let g:NERDTreeBookmark = s:Bookmark + +function! NERDTreeAddMenuItem(options) + call s:MenuItem.Create(a:options) +endfunction + +function! NERDTreeAddMenuSeparator(...) + let opts = a:0 ? a:1 : {} + call s:MenuItem.CreateSeparator(opts) +endfunction + +function! NERDTreeAddSubmenu(options) + return s:MenuItem.Create(a:options) +endfunction + +function! NERDTreeAddKeyMap(options) + call s:KeyMap.Create(a:options) +endfunction + +function! NERDTreeRender() + call s:renderView() +endfunction + +" SECTION: View Functions {{{1 +"============================================================ +"FUNCTION: s:centerView() {{{2 +"centers the nerd tree window around the cursor (provided the nerd tree +"options permit) +function! s:centerView() + if g:NERDTreeAutoCenter + let current_line = winline() + let lines_to_top = current_line + let lines_to_bottom = winheight(s:getTreeWinNum()) - current_line + if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold + normal! zz + endif + endif +endfunction +"FUNCTION: s:closeTree() {{{2 +"Closes the primary NERD tree window for this tab +function! s:closeTree() + if !s:isTreeOpen() + throw "NERDTree.NoTreeFoundError: no NERDTree is open" + endif + + if winnr("$") != 1 + if winnr() == s:getTreeWinNum() + wincmd p + let bufnr = bufnr("") + wincmd p + else + let bufnr = bufnr("") + endif + + call s:exec(s:getTreeWinNum() . " wincmd w") + close + call s:exec(bufwinnr(bufnr) . " wincmd w") + else + close + endif +endfunction + +"FUNCTION: s:closeTreeIfOpen() {{{2 +"Closes the NERD tree window if it is open +function! s:closeTreeIfOpen() + if s:isTreeOpen() + call s:closeTree() + endif +endfunction +"FUNCTION: s:closeTreeIfQuitOnOpen() {{{2 +"Closes the NERD tree window if the close on open option is set +function! s:closeTreeIfQuitOnOpen() + if g:NERDTreeQuitOnOpen && s:isTreeOpen() + call s:closeTree() + endif +endfunction +"FUNCTION: s:createTreeWin() {{{2 +"Inits the NERD tree window. ie. opens it, sizes it, sets all the local +"options etc +function! s:createTreeWin() + "create the nerd tree window + let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright " + let splitSize = g:NERDTreeWinSize + + if !exists('t:NERDTreeBufName') + let t:NERDTreeBufName = s:nextBufferName() + silent! exec splitLocation . 'vertical ' . splitSize . ' new' + silent! exec "edit " . t:NERDTreeBufName + else + silent! exec splitLocation . 'vertical ' . splitSize . ' split' + silent! exec "buffer " . t:NERDTreeBufName + endif + + setlocal winfixwidth + call s:setCommonBufOptions() +endfunction + +"FUNCTION: s:dumpHelp {{{2 +"prints out the quick help +function! s:dumpHelp() + let old_h = @h + if b:treeShowHelp ==# 1 + let @h= "\" NERD tree (" . s:NERD_tree_version . ") quickhelp~\n" + let @h=@h."\" ============================\n" + let @h=@h."\" File node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" + let @h=@h."\" ,\n" + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" + else + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" + endif + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" + endif + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" + let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" + let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" + let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Directory node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" + let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" + let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let @h=@h."\" current node recursively\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark table mappings~\n" + let @h=@h."\" double-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree navigation mappings~\n" + let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" + let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" + let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" + let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" + let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Filesystem mappings~\n" + let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" + let @h=@h."\" selected dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let @h=@h."\" but leave old root open\n" + let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" + let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" + let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" + let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" + let @h=@h."\" selected dir\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree filtering mappings~\n" + let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n" + + "add quickhelp entries for each custom key map + if len(s:KeyMap.All()) + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Custom mappings~\n" + for i in s:KeyMap.All() + let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" + endfor + endif + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Other mappings~\n" + let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let @h=@h."\" the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark commands~\n" + let @h=@h."\" :Bookmark \n" + let @h=@h."\" :BookmarkToRoot \n" + let @h=@h."\" :RevealBookmark \n" + let @h=@h."\" :OpenBookmark \n" + let @h=@h."\" :ClearBookmarks []\n" + let @h=@h."\" :ClearAllBookmarks\n" + silent! put h + elseif g:NERDTreeMinimalUI == 0 + let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" + silent! put h + endif + + let @h = old_h +endfunction +"FUNCTION: s:echo {{{2 +"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages +" +"Args: +"msg: the message to echo +function! s:echo(msg) + redraw + echomsg "NERDTree: " . a:msg +endfunction +"FUNCTION: s:echoWarning {{{2 +"Wrapper for s:echo, sets the message type to warningmsg for this message +"Args: +"msg: the message to echo +function! s:echoWarning(msg) + echohl warningmsg + call s:echo(a:msg) + echohl normal +endfunction +"FUNCTION: s:echoError {{{2 +"Wrapper for s:echo, sets the message type to errormsg for this message +"Args: +"msg: the message to echo +function! s:echoError(msg) + echohl errormsg + call s:echo(a:msg) + echohl normal +endfunction +"FUNCTION: s:firstUsableWindow(){{{2 +"find the window number of the first normal window +function! s:firstUsableWindow() + let i = 1 + while i <= winnr("$") + let bnum = winbufnr(i) + if bnum != -1 && getbufvar(bnum, '&buftype') ==# '' + \ && !getwinvar(i, '&previewwindow') + \ && (!getbufvar(bnum, '&modified') || &hidden) + return i + endif + + let i += 1 + endwhile + return -1 +endfunction +"FUNCTION: s:getPath(ln) {{{2 +"Gets the full path to the node that is rendered on the given line number +" +"Args: +"ln: the line number to get the path for +" +"Return: +"A path if a node was selected, {} if nothing is selected. +"If the 'up a dir' line was selected then the path to the parent of the +"current root is returned +function! s:getPath(ln) + let line = getline(a:ln) + + let rootLine = s:TreeFileNode.GetRootLineNum() + + "check to see if we have the root node + if a:ln == rootLine + return b:NERDTreeRoot.path + endif + + if !g:NERDTreeDirArrows + " in case called from outside the tree + if line !~# '^ *[|`▸▾ ]' || line =~# '^$' + return {} + endif + endif + + if line ==# s:tree_up_dir_line + return b:NERDTreeRoot.path.getParent() + endif + + let indent = s:indentLevelFor(line) + + "remove the tree parts and the leading space + let curFile = s:stripMarkupFromLine(line, 0) + + let wasdir = 0 + if curFile =~# '/$' + let wasdir = 1 + let curFile = substitute(curFile, '/\?$', '/', "") + endif + + let dir = "" + let lnum = a:ln + while lnum > 0 + let lnum = lnum - 1 + let curLine = getline(lnum) + let curLineStripped = s:stripMarkupFromLine(curLine, 1) + + "have we reached the top of the tree? + if lnum == rootLine + let dir = b:NERDTreeRoot.path.str({'format': 'UI'}) . dir + break + endif + if curLineStripped =~# '/$' + let lpindent = s:indentLevelFor(curLine) + if lpindent < indent + let indent = indent - 1 + + let dir = substitute (curLineStripped,'^\\', "", "") . dir + continue + endif + endif + endwhile + let curFile = b:NERDTreeRoot.path.drive . dir . curFile + let toReturn = s:Path.New(curFile) + return toReturn +endfunction + +"FUNCTION: s:getTreeWinNum() {{{2 +"gets the nerd tree window number for this tab +function! s:getTreeWinNum() + if exists("t:NERDTreeBufName") + return bufwinnr(t:NERDTreeBufName) + else + return -1 + endif +endfunction +"FUNCTION: s:indentLevelFor(line) {{{2 +function! s:indentLevelFor(line) + let level = match(a:line, '[^ \-+~▸▾`|]') / s:tree_wid + " check if line includes arrows + if match(a:line, '[▸▾]') > -1 + " decrement level as arrow uses 3 ascii chars + let level = level - 1 + endif + return level +endfunction +"FUNCTION: s:isTreeOpen() {{{2 +function! s:isTreeOpen() + return s:getTreeWinNum() != -1 +endfunction +"FUNCTION: s:isWindowUsable(winnumber) {{{2 +"Returns 0 if opening a file from the tree in the given window requires it to +"be split, 1 otherwise +" +"Args: +"winnumber: the number of the window in question +function! s:isWindowUsable(winnumber) + "gotta split if theres only one window (i.e. the NERD tree) + if winnr("$") ==# 1 + return 0 + endif + + let oldwinnr = winnr() + call s:exec(a:winnumber . "wincmd p") + let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow') + let modified = &modified + call s:exec(oldwinnr . "wincmd p") + + "if its a special window e.g. quickfix or another explorer plugin then we + "have to split + if specialWindow + return 0 + endif + + if &hidden + return 1 + endif + + return !modified || s:bufInWindows(winbufnr(a:winnumber)) >= 2 +endfunction + +" FUNCTION: s:jumpToChild(direction) {{{2 +" Args: +" direction: 0 if going to first child, 1 if going to last +function! s:jumpToChild(direction) + let currentNode = s:TreeFileNode.GetSelected() + if currentNode ==# {} || currentNode.isRoot() + call s:echo("cannot jump to " . (a:direction ? "last" : "first") . " child") + return + end + let dirNode = currentNode.parent + let childNodes = dirNode.getVisibleChildren() + + let targetNode = childNodes[0] + if a:direction + let targetNode = childNodes[len(childNodes) - 1] + endif + + if targetNode.equals(currentNode) + let siblingDir = currentNode.parent.findOpenDirSiblingWithVisibleChildren(a:direction) + if siblingDir != {} + let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0 + let targetNode = siblingDir.getChildByIndex(indx, 1) + endif + endif + + call targetNode.putCursorHere(1, 0) + + call s:centerView() +endfunction + + +"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{2 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is deleted +" +"Args: +"bufnum: the buffer that may be deleted +"msg: a message that will be echoed to the user asking them if they wish to +" del the buffer +function! s:promptToDelBuffer(bufnum, msg) + echo a:msg + if nr2char(getchar()) ==# 'y' + exec "silent bdelete! " . a:bufnum + endif +endfunction + +"FUNCTION: s:putCursorOnBookmarkTable(){{{2 +"Places the cursor at the top of the bookmarks table +function! s:putCursorOnBookmarkTable() + if !b:NERDTreeShowBookmarks + throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active" + endif + + if g:NERDTreeMinimalUI + return cursor(1, 2) + endif + + let rootNodeLine = s:TreeFileNode.GetRootLineNum() + + let line = 1 + while getline(line) !~# '^>-\+Bookmarks-\+$' + let line = line + 1 + if line >= rootNodeLine + throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table" + endif + endwhile + call cursor(line, 2) +endfunction + +"FUNCTION: s:putCursorInTreeWin(){{{2 +"Places the cursor in the nerd tree window +function! s:putCursorInTreeWin() + if !s:isTreeOpen() + throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists" + endif + + call s:exec(s:getTreeWinNum() . "wincmd w") +endfunction + +"FUNCTION: s:renderBookmarks {{{2 +function! s:renderBookmarks() + + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, ">----------Bookmarks----------") + call cursor(line(".")+1, col(".")) + endif + + for i in s:Bookmark.Bookmarks() + call setline(line(".")+1, i.str()) + call cursor(line(".")+1, col(".")) + endfor + + call setline(line(".")+1, '') + call cursor(line(".")+1, col(".")) +endfunction +"FUNCTION: s:renderView {{{2 +"The entry function for rendering the tree +function! s:renderView() + setlocal modifiable + + "remember the top line of the buffer and the current line so we can + "restore the view exactly how it was + let curLine = line(".") + let curCol = col(".") + let topLine = line("w0") + + "delete all lines in the buffer (being careful not to clobber a register) + silent 1,$delete _ + + call s:dumpHelp() + + "delete the blank line before the help and add one after it + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, "") + call cursor(line(".")+1, col(".")) + endif + + if b:NERDTreeShowBookmarks + call s:renderBookmarks() + endif + + "add the 'up a dir' line + if !g:NERDTreeMinimalUI + call setline(line(".")+1, s:tree_up_dir_line) + call cursor(line(".")+1, col(".")) + endif + + "draw the header line + let header = b:NERDTreeRoot.path.str({'format': 'UI', 'truncateTo': winwidth(0)}) + call setline(line(".")+1, header) + call cursor(line(".")+1, col(".")) + + "draw the tree + let old_o = @o + let @o = b:NERDTreeRoot.renderToString() + silent put o + let @o = old_o + + "delete the blank line at the top of the buffer + silent 1,1delete _ + + "restore the view + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(topLine, 1) + normal! zt + call cursor(curLine, curCol) + let &scrolloff = old_scrolloff + + setlocal nomodifiable +endfunction + +"FUNCTION: s:renderViewSavingPosition {{{2 +"Renders the tree and ensures the cursor stays on the current node or the +"current nodes parent if it is no longer available upon re-rendering +function! s:renderViewSavingPosition() + let currentNode = s:TreeFileNode.GetSelected() + + "go up the tree till we find a node that will be visible or till we run + "out of nodes + while currentNode != {} && !currentNode.isVisible() && !currentNode.isRoot() + let currentNode = currentNode.parent + endwhile + + call s:renderView() + + if currentNode != {} + call currentNode.putCursorHere(0, 0) + endif +endfunction +"FUNCTION: s:restoreScreenState() {{{2 +" +"Sets the screen state back to what it was when s:saveScreenState was last +"called. +" +"Assumes the cursor is in the NERDTree window +function! s:restoreScreenState() + if !exists("b:NERDTreeOldTopLine") || !exists("b:NERDTreeOldPos") || !exists("b:NERDTreeOldWindowSize") + return + endif + exec("silent vertical resize ".b:NERDTreeOldWindowSize) + + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(b:NERDTreeOldTopLine, 0) + normal! zt + call setpos(".", b:NERDTreeOldPos) + let &scrolloff=old_scrolloff +endfunction + +"FUNCTION: s:saveScreenState() {{{2 +"Saves the current cursor position in the current buffer and the window +"scroll position +function! s:saveScreenState() + let win = winnr() + try + call s:putCursorInTreeWin() + let b:NERDTreeOldPos = getpos(".") + let b:NERDTreeOldTopLine = line("w0") + let b:NERDTreeOldWindowSize = winwidth("") + call s:exec(win . "wincmd w") + catch /^NERDTree.InvalidOperationError/ + endtry +endfunction + +"FUNCTION: s:setCommonBufOptions() {{{2 +function! s:setCommonBufOptions() + "throwaway buffer options + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nowrap + setlocal foldcolumn=0 + setlocal nobuflisted + setlocal nospell + if g:NERDTreeShowLineNumbers + setlocal nu + else + setlocal nonu + if v:version >= 703 + setlocal nornu + endif + endif + + iabc + + if g:NERDTreeHighlightCursorline + setlocal cursorline + endif + + call s:setupStatusline() + + + let b:treeShowHelp = 0 + let b:NERDTreeIgnoreEnabled = 1 + let b:NERDTreeShowFiles = g:NERDTreeShowFiles + let b:NERDTreeShowHidden = g:NERDTreeShowHidden + let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks + setfiletype nerdtree + call s:bindMappings() +endfunction + +"FUNCTION: s:setupStatusline() {{{2 +function! s:setupStatusline() + if g:NERDTreeStatusline != -1 + let &l:statusline = g:NERDTreeStatusline + endif +endfunction +"FUNCTION: s:stripMarkupFromLine(line, removeLeadingSpaces){{{2 +"returns the given line with all the tree parts stripped off +" +"Args: +"line: the subject line +"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces = +"any spaces before the actual text of the node) +function! s:stripMarkupFromLine(line, removeLeadingSpaces) + let line = a:line + "remove the tree parts and the leading space + let line = substitute (line, s:tree_markup_reg,"","") + + "strip off any read only flag + let line = substitute (line, ' \[RO\]', "","") + + "strip off any bookmark flags + let line = substitute (line, ' {[^}]*}', "","") + + "strip off any executable flags + let line = substitute (line, '*\ze\($\| \)', "","") + + let wasdir = 0 + if line =~# '/$' + let wasdir = 1 + endif + let line = substitute (line,' -> .*',"","") " remove link to + if wasdir ==# 1 + let line = substitute (line, '/\?$', '/', "") + endif + + if a:removeLeadingSpaces + let line = substitute (line, '^ *', '', '') + endif + + return line +endfunction + +"FUNCTION: s:toggle(dir) {{{2 +"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is +"closed it is restored or initialized (if it doesnt exist) +" +"Args: +"dir: the full path for the root node (is only used if the NERD tree is being +"initialized. +function! s:toggle(dir) + if s:treeExistsForTab() + if !s:isTreeOpen() + call s:createTreeWin() + if !&hidden + call s:renderView() + endif + call s:restoreScreenState() + else + call s:closeTree() + endif + else + call s:initNerdTree(a:dir) + endif +endfunction +"SECTION: Interface bindings {{{1 +"============================================================ +"FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2 +"If the current node is a file, open it in the previous window (or a new one +"if the previous is modified). If it is a directory then it is opened. +" +"args: +"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set +function! s:activateNode(forceKeepWindowOpen) + if getline(".") ==# s:tree_up_dir_line + return s:upDir(0) + endif + + let treenode = s:TreeFileNode.GetSelected() + if treenode != {} + call treenode.activate(a:forceKeepWindowOpen) + else + let bookmark = s:Bookmark.GetSelected() + if !empty(bookmark) + call bookmark.activate() + endif + endif +endfunction + +"FUNCTION: s:bindMappings() {{{2 +function! s:bindMappings() + " set up mappings and commands for this buffer + nnoremap :call handleMiddleMouse() + nnoremap :call checkForActivate() + nnoremap <2-leftmouse> :call activateNode(0) + + exec "nnoremap ". g:NERDTreeMapActivateNode . " :call activateNode(0)" + exec "nnoremap ". g:NERDTreeMapOpenSplit ." :call openEntrySplit(0,0)" + exec "nnoremap :call activateNode(0)" + + exec "nnoremap ". g:NERDTreeMapPreview ." :call previewNode(0)" + exec "nnoremap ". g:NERDTreeMapPreviewSplit ." :call previewNode(1)" + + exec "nnoremap ". g:NERDTreeMapOpenVSplit ." :call openEntrySplit(1,0)" + exec "nnoremap ". g:NERDTreeMapPreviewVSplit ." :call previewNode(2)" + + exec "nnoremap ". g:NERDTreeMapOpenRecursively ." :call openNodeRecursively()" + + exec "nnoremap ". g:NERDTreeMapUpdirKeepOpen ." :call upDir(1)" + exec "nnoremap ". g:NERDTreeMapUpdir ." :call upDir(0)" + exec "nnoremap ". g:NERDTreeMapChangeRoot ." :call chRoot()" + + exec "nnoremap ". g:NERDTreeMapChdir ." :call chCwd()" + + exec "nnoremap ". g:NERDTreeMapQuit ." :call closeTreeWindow()" + + exec "nnoremap ". g:NERDTreeMapRefreshRoot ." :call refreshRoot()" + exec "nnoremap ". g:NERDTreeMapRefresh ." :call refreshCurrent()" + + exec "nnoremap ". g:NERDTreeMapHelp ." :call displayHelp()" + exec "nnoremap ". g:NERDTreeMapToggleZoom ." :call toggleZoom()" + exec "nnoremap ". g:NERDTreeMapToggleHidden ." :call toggleShowHidden()" + exec "nnoremap ". g:NERDTreeMapToggleFilters ." :call toggleIgnoreFilter()" + exec "nnoremap ". g:NERDTreeMapToggleFiles ." :call toggleShowFiles()" + exec "nnoremap ". g:NERDTreeMapToggleBookmarks ." :call toggleShowBookmarks()" + + exec "nnoremap ". g:NERDTreeMapCloseDir ." :call closeCurrentDir()" + exec "nnoremap ". g:NERDTreeMapCloseChildren ." :call closeChildren()" + + exec "nnoremap ". g:NERDTreeMapMenu ." :call showMenu()" + + exec "nnoremap ". g:NERDTreeMapJumpParent ." :call jumpToParent()" + exec "nnoremap ". g:NERDTreeMapJumpNextSibling ." :call jumpToSibling(1)" + exec "nnoremap ". g:NERDTreeMapJumpPrevSibling ." :call jumpToSibling(0)" + exec "nnoremap ". g:NERDTreeMapJumpFirstChild ." :call jumpToFirstChild()" + exec "nnoremap ". g:NERDTreeMapJumpLastChild ." :call jumpToLastChild()" + exec "nnoremap ". g:NERDTreeMapJumpRoot ." :call jumpToRoot()" + + exec "nnoremap ". g:NERDTreeMapOpenInTab ." :call openInNewTab(0)" + exec "nnoremap ". g:NERDTreeMapOpenInTabSilent ." :call openInNewTab(1)" + + exec "nnoremap ". g:NERDTreeMapOpenExpl ." :call openExplorer()" + + exec "nnoremap ". g:NERDTreeMapDeleteBookmark ." :call deleteBookmark()" + + "bind all the user custom maps + call s:KeyMap.BindAll() + + command! -buffer -nargs=? Bookmark :call bookmarkNode('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 RevealBookmark :call revealBookmark('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 OpenBookmark :call openBookmark('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=* ClearBookmarks call clearBookmarks('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=+ BookmarkToRoot call s:Bookmark.ToRoot('') + command! -buffer -nargs=0 ClearAllBookmarks call s:Bookmark.ClearAll() call renderView() + command! -buffer -nargs=0 ReadBookmarks call s:Bookmark.CacheBookmarks(0) call renderView() + command! -buffer -nargs=0 WriteBookmarks call s:Bookmark.Write() +endfunction + +" FUNCTION: s:bookmarkNode(name) {{{2 +" Associate the current node with the given name +function! s:bookmarkNode(...) + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + let name = a:1 + if empty(name) + let name = currentNode.path.getLastPathComponent(0) + endif + try + call currentNode.bookmark(name) + call s:renderView() + catch /^NERDTree.IllegalBookmarkNameError/ + call s:echo("bookmark names must not contain spaces") + endtry + else + call s:echo("select a node first") + endif +endfunction +"FUNCTION: s:checkForActivate() {{{2 +"Checks if the click should open the current node, if so then activate() is +"called (directories are automatically opened if the symbol beside them is +"clicked) +function! s:checkForActivate() + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + let startToCur = strpart(getline(line(".")), 0, col(".")) + + if currentNode.path.isDirectory + if startToCur =~# s:tree_markup_reg . '$' && startToCur =~# '[+~▾▸]$' + call s:activateNode(0) + return + endif + endif + + if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 + let char = strpart(startToCur, strlen(startToCur)-1, 1) + if char !~# s:tree_markup_reg + call s:activateNode(0) + return + endif + endif + endif +endfunction + +" FUNCTION: s:chCwd() {{{2 +function! s:chCwd() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + try + call treenode.path.changeToDir() + catch /^NERDTree.PathChangeError/ + call s:echoWarning("could not change cwd") + endtry +endfunction + +" FUNCTION: s:chRoot() {{{2 +" changes the current root to the selected one +function! s:chRoot() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + call treenode.makeRoot() + call s:renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:clearBookmarks(bookmarks) {{{2 +function! s:clearBookmarks(bookmarks) + if a:bookmarks ==# '' + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + call currentNode.clearBoomarks() + endif + else + for name in split(a:bookmarks, ' ') + let bookmark = s:Bookmark.BookmarkFor(name) + call bookmark.delete() + endfor + endif + call s:renderView() +endfunction +" FUNCTION: s:closeChildren() {{{2 +" closes all childnodes of the current node +function! s:closeChildren() + let currentNode = s:TreeDirNode.GetSelected() + if currentNode ==# {} + call s:echo("Select a node first") + return + endif + + call currentNode.closeChildren() + call s:renderView() + call currentNode.putCursorHere(0, 0) +endfunction +" FUNCTION: s:closeCurrentDir() {{{2 +" closes the parent dir of the current node +function! s:closeCurrentDir() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + let parent = treenode.parent + if parent ==# {} || parent.isRoot() + call s:echo("cannot close tree root") + else + call treenode.parent.close() + call s:renderView() + call treenode.parent.putCursorHere(0, 0) + endif +endfunction +" FUNCTION: s:closeTreeWindow() {{{2 +" close the tree window +function! s:closeTreeWindow() + if b:NERDTreeType ==# "secondary" && b:NERDTreePreviousBuf != -1 + exec "buffer " . b:NERDTreePreviousBuf + else + if winnr("$") > 1 + call s:closeTree() + else + call s:echo("Cannot close last window") + endif + endif +endfunction +" FUNCTION: s:deleteBookmark() {{{2 +" if the cursor is on a bookmark, prompt to delete +function! s:deleteBookmark() + let bookmark = s:Bookmark.GetSelected() + if bookmark ==# {} + call s:echo("Put the cursor on a bookmark") + return + endif + + echo "Are you sure you wish to delete the bookmark:\n\"" . bookmark.name . "\" (yN):" + + if nr2char(getchar()) ==# 'y' + try + call bookmark.delete() + call s:renderView() + redraw + catch /^NERDTree/ + call s:echoWarning("Could not remove bookmark") + endtry + else + call s:echo("delete aborted" ) + endif + +endfunction + +" FUNCTION: s:displayHelp() {{{2 +" toggles the help display +function! s:displayHelp() + let b:treeShowHelp = b:treeShowHelp ? 0 : 1 + call s:renderView() + call s:centerView() +endfunction + +" FUNCTION: s:handleMiddleMouse() {{{2 +function! s:handleMiddleMouse() + let curNode = s:TreeFileNode.GetSelected() + if curNode ==# {} + call s:echo("Put the cursor on a node first" ) + return + endif + + if curNode.path.isDirectory + call s:openExplorer() + else + call s:openEntrySplit(0,0) + endif +endfunction + + +" FUNCTION: s:jumpToFirstChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToFirstChild() + call s:jumpToChild(0) +endfunction + +" FUNCTION: s:jumpToLastChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToLastChild() + call s:jumpToChild(1) +endfunction + +" FUNCTION: s:jumpToParent() {{{2 +" moves the cursor to the parent of the current node +function! s:jumpToParent() + let currentNode = s:TreeFileNode.GetSelected() + if !empty(currentNode) + if !empty(currentNode.parent) + call currentNode.parent.putCursorHere(1, 0) + call s:centerView() + else + call s:echo("cannot jump to parent") + endif + else + call s:echo("put the cursor on a node first") + endif +endfunction + +" FUNCTION: s:jumpToRoot() {{{2 +" moves the cursor to the root node +function! s:jumpToRoot() + call b:NERDTreeRoot.putCursorHere(1, 0) + call s:centerView() +endfunction + +" FUNCTION: s:jumpToSibling() {{{2 +" moves the cursor to the sibling of the current node in the given direction +" +" Args: +" forward: 1 if the cursor should move to the next sibling, 0 if it should +" move back to the previous sibling +function! s:jumpToSibling(forward) + let currentNode = s:TreeFileNode.GetSelected() + if !empty(currentNode) + let sibling = currentNode.findSibling(a:forward) + + if !empty(sibling) + call sibling.putCursorHere(1, 0) + call s:centerView() + endif + else + call s:echo("put the cursor on a node first") + endif +endfunction + +" FUNCTION: s:openBookmark(name) {{{2 +" put the cursor on the given bookmark and, if its a file, open it +function! s:openBookmark(name) + try + let targetNode = s:Bookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + redraw! + catch /^NERDTree.BookmarkedNodeNotFoundError/ + call s:echo("note - target node is not cached") + let bookmark = s:Bookmark.BookmarkFor(a:name) + let targetNode = s:TreeFileNode.New(bookmark.path) + endtry + if targetNode.path.isDirectory + call targetNode.openExplorer() + else + call targetNode.open() + endif +endfunction +" FUNCTION: s:openEntrySplit(vertical, forceKeepWindowOpen) {{{2 +"Opens the currently selected file from the explorer in a +"new window +" +"args: +"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set +function! s:openEntrySplit(vertical, forceKeepWindowOpen) + let treenode = s:TreeFileNode.GetSelected() + if treenode != {} + if a:vertical + call treenode.openVSplit() + else + call treenode.openSplit() + endif + if !a:forceKeepWindowOpen + call s:closeTreeIfQuitOnOpen() + endif + else + call s:echo("select a node first") + endif +endfunction + +" FUNCTION: s:openExplorer() {{{2 +function! s:openExplorer() + let treenode = s:TreeDirNode.GetSelected() + if treenode != {} + call treenode.openExplorer() + else + call s:echo("select a node first") + endif +endfunction + +" FUNCTION: s:openInNewTab(stayCurrentTab) {{{2 +" Opens the selected node or bookmark in a new tab +" Args: +" stayCurrentTab: if 1 then vim will stay in the current tab, if 0 then vim +" will go to the tab where the new file is opened +function! s:openInNewTab(stayCurrentTab) + let target = s:TreeFileNode.GetSelected() + if target == {} + let target = s:Bookmark.GetSelected() + endif + + if target != {} + call target.openInNewTab({'stayInCurrentTab': a:stayCurrentTab}) + endif +endfunction + +" FUNCTION: s:openNodeRecursively() {{{2 +function! s:openNodeRecursively() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} || treenode.path.isDirectory ==# 0 + call s:echo("Select a directory node first" ) + else + call s:echo("Recursively opening node. Please wait...") + call treenode.openRecursively() + call s:renderView() + redraw + call s:echo("Recursively opening node. Please wait... DONE") + endif + +endfunction + +"FUNCTION: s:previewNode() {{{2 +"Args: +" openNewWin: if 0, use the previous window, if 1 open in new split, if 2 +" open in a vsplit +function! s:previewNode(openNewWin) + let currentBuf = bufnr("") + if a:openNewWin > 0 + call s:openEntrySplit(a:openNewWin ==# 2,1) + else + call s:activateNode(1) + end + call s:exec(bufwinnr(currentBuf) . "wincmd w") +endfunction + +" FUNCTION: s:revealBookmark(name) {{{2 +" put the cursor on the node associate with the given name +function! s:revealBookmark(name) + try + let targetNode = s:Bookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + catch /^NERDTree.BookmarkNotFoundError/ + call s:echo("Bookmark isnt cached under the current root") + endtry +endfunction +" FUNCTION: s:refreshRoot() {{{2 +" Reloads the current root. All nodes below this will be lost and the root dir +" will be reloaded. +function! s:refreshRoot() + call s:echo("Refreshing the root node. This could take a while...") + call b:NERDTreeRoot.refresh() + call s:renderView() + redraw + call s:echo("Refreshing the root node. This could take a while... DONE") +endfunction + +" FUNCTION: s:refreshCurrent() {{{2 +" refreshes the root for the current node +function! s:refreshCurrent() + let treenode = s:TreeDirNode.GetSelected() + if treenode ==# {} + call s:echo("Refresh failed. Select a node first") + return + endif + + call s:echo("Refreshing node. This could take a while...") + call treenode.refresh() + call s:renderView() + redraw + call s:echo("Refreshing node. This could take a while... DONE") +endfunction +" FUNCTION: s:showMenu() {{{2 +function! s:showMenu() + let curNode = s:TreeFileNode.GetSelected() + if curNode ==# {} + call s:echo("Put the cursor on a node first" ) + return + endif + + let mc = s:MenuController.New(s:MenuItem.AllEnabled()) + call mc.showMenu() +endfunction + +" FUNCTION: s:toggleIgnoreFilter() {{{2 +" toggles the use of the NERDTreeIgnore option +function! s:toggleIgnoreFilter() + let b:NERDTreeIgnoreEnabled = !b:NERDTreeIgnoreEnabled + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleShowBookmarks() {{{2 +" toggles the display of bookmarks +function! s:toggleShowBookmarks() + let b:NERDTreeShowBookmarks = !b:NERDTreeShowBookmarks + if b:NERDTreeShowBookmarks + call s:renderView() + call s:putCursorOnBookmarkTable() + else + call s:renderViewSavingPosition() + endif + call s:centerView() +endfunction +" FUNCTION: s:toggleShowFiles() {{{2 +" toggles the display of hidden files +function! s:toggleShowFiles() + let b:NERDTreeShowFiles = !b:NERDTreeShowFiles + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleShowHidden() {{{2 +" toggles the display of hidden files +function! s:toggleShowHidden() + let b:NERDTreeShowHidden = !b:NERDTreeShowHidden + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleZoom() {{2 +" zoom (maximize/minimize) the NERDTree window +function! s:toggleZoom() + if exists("b:NERDTreeZoomed") && b:NERDTreeZoomed + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + exec "silent vertical resize ". size + let b:NERDTreeZoomed = 0 + else + exec "vertical resize" + let b:NERDTreeZoomed = 1 + endif +endfunction + +"FUNCTION: s:upDir(keepState) {{{2 +"moves the tree up a level +" +"Args: +"keepState: 1 if the current root should be left open when the tree is +"re-rendered +function! s:upDir(keepState) + let cwd = b:NERDTreeRoot.path.str({'format': 'UI'}) + if cwd ==# "/" || cwd =~# '^[^/]..$' + call s:echo("already at top dir") + else + if !a:keepState + call b:NERDTreeRoot.close() + endif + + let oldRoot = b:NERDTreeRoot + + if empty(b:NERDTreeRoot.parent) + let path = b:NERDTreeRoot.path.getParent() + let newRoot = s:TreeDirNode.New(path) + call newRoot.open() + call newRoot.transplantChild(b:NERDTreeRoot) + let b:NERDTreeRoot = newRoot + else + let b:NERDTreeRoot = b:NERDTreeRoot.parent + endif + + if g:NERDTreeChDirMode ==# 2 + call b:NERDTreeRoot.path.changeToDir() + endif + + call s:renderView() + call oldRoot.putCursorHere(0, 0) + endif +endfunction + + +"reset &cpo back to users setting +let &cpo = s:old_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/acp.vim b/plugin/acp.vim new file mode 100644 index 00000000..0c01a318 --- /dev/null +++ b/plugin/acp.vim @@ -0,0 +1,170 @@ +"============================================================================= +" Copyright (c) 2007-2009 Takeshi NISHIDA +" +" GetLatestVimScripts: 1879 1 :AutoInstall: AutoComplPop +"============================================================================= +" LOAD GUARD {{{1 + +if exists('g:loaded_acp') + finish +elseif v:version < 702 + echoerr 'AutoComplPop does not support this version of vim (' . v:version . ').' + finish +endif +let g:loaded_acp = 1 + +" }}}1 +"============================================================================= +" FUNCTION: {{{1 + +" +function s:defineOption(name, default) + if !exists(a:name) + let {a:name} = a:default + endif +endfunction + +" +function s:makeDefaultBehavior() + let behavs = { + \ '*' : [], + \ 'ruby' : [], + \ 'python' : [], + \ 'perl' : [], + \ 'xml' : [], + \ 'html' : [], + \ 'xhtml' : [], + \ 'css' : [], + \ } + "--------------------------------------------------------------------------- + if !empty(g:acp_behaviorUserDefinedFunction) && + \ !empty(g:acp_behaviorUserDefinedMeets) + for key in keys(behavs) + call add(behavs[key], { + \ 'command' : "\\", + \ 'completefunc' : g:acp_behaviorUserDefinedFunction, + \ 'meets' : g:acp_behaviorUserDefinedMeets, + \ 'repeat' : 0, + \ }) + endfor + endif + "--------------------------------------------------------------------------- + for key in keys(behavs) + call add(behavs[key], { + \ 'command' : "\\", + \ 'completefunc' : 'acp#completeSnipmate', + \ 'meets' : 'acp#meetsForSnipmate', + \ 'onPopupClose' : 'acp#onPopupCloseSnipmate', + \ 'repeat' : 0, + \ }) + endfor + "--------------------------------------------------------------------------- + for key in keys(behavs) + call add(behavs[key], { + \ 'command' : g:acp_behaviorKeywordCommand, + \ 'meets' : 'acp#meetsForKeyword', + \ 'repeat' : 0, + \ }) + endfor + "--------------------------------------------------------------------------- + for key in keys(behavs) + call add(behavs[key], { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForFile', + \ 'repeat' : 1, + \ }) + endfor + "--------------------------------------------------------------------------- + call add(behavs.ruby, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForRubyOmni', + \ 'repeat' : 0, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.python, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForPythonOmni', + \ 'repeat' : 0, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.perl, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForPerlOmni', + \ 'repeat' : 0, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.xml, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForXmlOmni', + \ 'repeat' : 1, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.html, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForHtmlOmni', + \ 'repeat' : 1, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.xhtml, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForHtmlOmni', + \ 'repeat' : 1, + \ }) + "--------------------------------------------------------------------------- + call add(behavs.css, { + \ 'command' : "\\", + \ 'meets' : 'acp#meetsForCssOmni', + \ 'repeat' : 0, + \ }) + "--------------------------------------------------------------------------- + return behavs +endfunction + +" }}}1 +"============================================================================= +" INITIALIZATION {{{1 + +"----------------------------------------------------------------------------- +call s:defineOption('g:acp_enableAtStartup', 1) +call s:defineOption('g:acp_mappingDriven', 0) +call s:defineOption('g:acp_ignorecaseOption', 1) +call s:defineOption('g:acp_completeOption', '.,w,b,k') +call s:defineOption('g:acp_completeoptPreview', 0) +call s:defineOption('g:acp_behaviorUserDefinedFunction', '') +call s:defineOption('g:acp_behaviorUserDefinedMeets', '') +call s:defineOption('g:acp_behaviorSnipmateLength', -1) +call s:defineOption('g:acp_behaviorKeywordCommand', "\") +call s:defineOption('g:acp_behaviorKeywordLength', 2) +call s:defineOption('g:acp_behaviorKeywordIgnores', []) +call s:defineOption('g:acp_behaviorFileLength', 0) +call s:defineOption('g:acp_behaviorRubyOmniMethodLength', 0) +call s:defineOption('g:acp_behaviorRubyOmniSymbolLength', 1) +call s:defineOption('g:acp_behaviorPythonOmniLength', 0) +call s:defineOption('g:acp_behaviorPerlOmniLength', -1) +call s:defineOption('g:acp_behaviorXmlOmniLength', 0) +call s:defineOption('g:acp_behaviorHtmlOmniLength', 0) +call s:defineOption('g:acp_behaviorCssOmniPropertyLength', 1) +call s:defineOption('g:acp_behaviorCssOmniValueLength', 0) +call s:defineOption('g:acp_behavior', {}) +"----------------------------------------------------------------------------- +call extend(g:acp_behavior, s:makeDefaultBehavior(), 'keep') +"----------------------------------------------------------------------------- +command! -bar -narg=0 AcpEnable call acp#enable() +command! -bar -narg=0 AcpDisable call acp#disable() +command! -bar -narg=0 AcpLock call acp#lock() +command! -bar -narg=0 AcpUnlock call acp#unlock() +"----------------------------------------------------------------------------- +" legacy commands +command! -bar -narg=0 AutoComplPopEnable AcpEnable +command! -bar -narg=0 AutoComplPopDisable AcpDisable +command! -bar -narg=0 AutoComplPopLock AcpLock +command! -bar -narg=0 AutoComplPopUnlock AcpUnlock +"----------------------------------------------------------------------------- +if g:acp_enableAtStartup + AcpEnable +endif +"----------------------------------------------------------------------------- + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/plugin/autoproto.vim b/plugin/autoproto.vim new file mode 100644 index 00000000..79e31e22 --- /dev/null +++ b/plugin/autoproto.vim @@ -0,0 +1,751 @@ +" GPL Notice: +" +" This program is free software; you can redistribute it and/or modify +" it under the terms of the GNU General Public License as published by +" the Free Software Foundation; either version 2 of the License, or +" (at your option) any later version. +" +" This program is distributed in the hope that it will be useful, +" but WITHOUT ANY WARRANTY; without even the implied warranty of +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +" GNU Library General Public License for more details. +" +" You should have received a copy of the GNU General Public License +" along with this program; if not, write to the Free Software +" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +" +" +" Name: +" +" autoproto.vim +" +" +" Copyright: +" +" Jochen Baier, 2006 (email@Jochen-Baier.de) +" +" +" Based on: +" +" cream-pop.vim +" CursorHold example +" +" Version: 0.06 +" Last Modified: Jun 20, 2006 +" +" +" The "autoproto" plugin displays the function parameter/prototypes +" in the preview window if you type a left parenthesis behind +" a function name. +" With this plugin it is not necessary to memorize large parameter lists. +" You do not need to leave insert mode. Typing is almost not affected. +" +" +" Supported Languages: C +" +" Installation: +" +" * Drop autoproto.vim into your plugin directory +" +" * The script need a tag file to work: +" - for your project: ":!ctags -R ." (or use the gvim button) +" - for library functions: +" run: "ctags -R -f ~/.vim/systags --c-kinds=+p /usr/include /usr/local/include" +" put "set tags+=~/.vim/systags" in your .vimrc file. +" +" * Open some *.c file and write for example: "XCreateWindow (" +" (or "XCreateWindow("). +" If the tag exist it will be shown in the preview window. +" Note: only *.c files are supported ! The file must exist. +" +" + +function! Debug (...) + + "remove for debug + return + + let i = 1 + let msg= "" + while i <= a:0 + exe "let msg=msg.a:".i + if i < a:0 + let msg=msg." " + endif + let i=i+1 + endwhile + + call Decho (msg) + +endfunction + +function! Rm_leading_spaces (string) + + let first_letter=0 + + while 1==1 + + if a:string[first_letter] != " " + break + else + let first_letter=first_letter + 1 + endif + + if first_letter >= strlen(a:string) + call Debug ("leading spaces problem -> skip") + return 0 + endif + + endwhile + + return strpart(a:string, first_letter) + +endfunction + +function Rm_trailing_spaces (string) + + let line=a:string + let string_len = strlen (line) + let last_letter=string_len - 1 + let space_count = 0 + + while 1==1 + + if line[last_letter] != " " + break + else + let last_letter=last_letter - 1 + let space_count = space_count + 1 + call Debug ("space_count: " . space_count) + + if space_count > 1 + call Debug ("too many trailing spaces -> skip") + return 0 + endif + + endif + + if last_letter <= 1 + call Debug ("trailing spaces problem -> skip") + return 0 + endif + + endwhile + + return strpart(line, 0, last_letter + 1) + +endfunction + +function! Chop_it (da_line) + + let line=a:da_line + + let line=Rm_trailing_spaces (line) + + if line == "0" + return 0 + endif + + call Debug ("after remove trailing spaces: <" . line. ">" ) + + let line=Rm_leading_spaces(line) + if line == "0" + return 0 + endif + + + "could be inside a comment + if strpart(line, 0, 2) == "/*" + call Debug ("large comment found") + return 0 + endif + + if strpart(line, 0, 2) == "//" + call Debug ("line comment found") + return 0 + endif + + + "semicolon ? + let semi=strridx (line, ";") + if semi != -1 + let line=strpart(line, semi+1) + call Debug("after last semi: <" . line . ">") + endif + + let line=Rm_leading_spaces(line) + call Debug("line after leading_spaces after semi: <" . line . ">") + if line == "0" + return 0 + endif + + call Debug ("cleand line: <" . line . ">") + + + "could be a new function definition... + + if strridx (line, "=") == -1 + + if strpart(line, 0, 6) == "static" + call Debug ("static found") + return 0 + endif + + if strpart(line, 0, 4) == "void" + call Debug ("void found") + return 0 + endif + + if strpart(line, 0, 6) == "extern" + call Debug ("extern found") + return 0 + endif + + if strpart(line, 0, 8) == "volatile" + call Debug ("volatile found") + return 0 + endif + + if strpart(line, 0, 6) == "inline" + call Debug ("inline found") + return 0 + endif + + if strpart(line, 0, 6) == "struct" + call Debug ("inline found") + return 0 + endif + + if strpart(line, 0, 8) == "unsigned" + call Debug ("unsigned found") + return 0 + endif + + if strpart(line, 0, 3) == "int" + call Debug ("int found") + return 0 + endif + + if strpart(line, 0, 4) == "long" + call Debug ("long found") + return 0 + endif + + if strpart(line, 0, 5) == "fload" + call Debug ("fload found") + return 0 + endif + + if strpart(line, 0, 4) == "char" + call Debug ("char found") + return 0 + endif + + endif + + "comma ? + let comma=strridx (line, ",") + if comma != -1 + let line=strpart(line, comma+1) + call Debug("after comma: <" . line . ">") + endif + + let line=Rm_leading_spaces(line) + if line == "0" + return 0 + endif + + "could be inside a string + if stridx (line, "\"") != -1 + call Debug("probably inside a string") + return 0 + endif + + "last space + let last_blank= strridx(line, " ") + if last_blank != -1 + call Debug ("last_blank found") + let line = strpart(line, last_blank + 1) + endif + + call Debug ("last_string:<" . line . ">") + + if strlen (line) == 0 + call Debug ("last_string zero length -> skip") + return 0 + endif + + + "signs.. + let start_pos = -1 + let tmp= strridx(line, "!") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "=") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "{") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "+") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "-") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, ">") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "<") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, ":") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "?") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + + let tmp= strridx(line, ")") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "(") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "&") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "|") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "/") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "%") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "~") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "\"") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + let tmp= strridx(line, "*") + if tmp != -1 + if tmp > start_pos + let start_pos=tmp + endif + endif + + if start_pos >= (strlen (line)-1) + call Debug("start_pos >= strlen") + return 0 + endif + + call Debug ("start_pos: " . start_pos) + + let line = strpart(line, start_pos+1) + call Debug("last word:<". line . ">") + + let word_len =strlen (line) + call Debug ("word len:" . word_len) + + if word_len == 0 + call Debug ("zero length word ->skip") + return 0 + endif + + while 1==1 + + if line == "if" + return 0 + endif + + if line == "for" + return 0 + endif + + if line == "while" + return 0 + endif + + if line == "switch" + return 0 + endif + + if line == "sizeof" + return 0 + endif + + if line == "int" + return 0 + endif + + if line == "long" + return 0 + endif + + if line == "float" + return 0 + endif + + if line == "char" + return 0 + endif + + if line == "return" + return 0 + endif + + break + endwhile + + return line + +endfunction + + +function! Display_tag (tag) + + silent! wincmd P + if &previewwindow + match none + wincmd p + endif + + let ignorec=&ignorecase + if ignorec==1 + call Debug ("ignorecase is set") + set noignorecase + endif + + try + exe "ptag " . a:tag + catch + call Debug ("ptag failed !") + + if ignorec == 1 + set ignorecase + endif + + return 0 + endtry + + if ignorec == 1 + set ignorecase + endif + + silent! wincmd P + if &previewwindow + + if has("folding") + silent! .foldopen + endif + + let cur_pos=winline() + if cur_pos <= 1 + let cur_pos = 0 + else + let cur_pos=cur_pos -1 + endif + + call search("$", "b") + let w = substitute(a:tag, '\\', '\\\\', "") + call search('\<\V' . a:tag . '\>') + hi previewWord term=bold ctermbg=green guibg=green + exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"' + + if cur_pos != 0 + execute "normal " . cur_pos . "\" + endif + + wincmd p + + endif + + return 1 + +endfunction + +function! Semi_typed() + + call Debug ("Semi_typed, reset all") + + call Unmap_semi() + call Unmap_close_bracket() + + + if exists ("b:recent_braces") + unlet b:recent_braces + endif + + +endfunction + + +function! Unmap_close_bracket() + + try + iunmap ) + catch + call Debug ("umap close bracket failed but catched!") + endtry +endfunction + +function! Map_close_bracket() + + try + inoremap ) ):call Close_bracket()li + catch + call Debug ("map close bracket failed") + endtry + +endfunction + + +function! Map_semi() + + try + inoremap ; ;:call Semi_typed() + catch + call Debug ("mapping semi failed") + endtry + +endfunction + + +function! Unmap_semi() + + try + iunmap ; + catch + call Debug ("unmap semi failed") + endtry + +endfunction + + +function! Close_bracket() + + call Debug ("close bracket") + + if !exists ("b:recent_braces") + call Debug ("no recent_braces in close_bracket") + call Unmap_close_bracket () + return + endif + + execute "normal %" + let brace_pos=getpos(".") + execute "normal %" + + let brace_line=brace_pos[1] + let brace_column=brace_pos[2] + + call Debug ("found matching brace at: brace_line: " . brace_line . " brace_column: " . brace_column ) + + let tag_iter = 0 + let tag_index = -1 + + for list_line in b:recent_braces + + if list_line[1] == brace_line + if list_line[2] == brace_column + + let tag_index=tag_iter + break + endif + endif + + let tag_iter = tag_iter +1 + endfor + + + if tag_index != -1 + call Debug ("matchin tag: <" . b:recent_braces[tag_index][0] . ">" ) + else + call Debug ("no matching tag found") + return + endif + + if tag_index == 0 + call Debug ("last recent tag: delete recent_braces list, unmap") + unlet b:recent_braces + call Unmap_close_bracket() + + silent! wincmd P + if &previewwindow + match none + wincmd p + endif + + + return + endif + + let tag_to_display = b:recent_braces[tag_index-1][0] + call Debug ("tag_to_display: " . tag_to_display) + + + call remove (b:recent_braces, tag_index) + + call Display_tag (tag_to_display) + + +endfunction + + +function! Open_bracket (...) + + let brace_pos=getpos(".") + + call Debug ("function: Open_bracket") + + let line=getline (".") + let line_len=strlen (line) + call Debug ("line: <" . line . ">") + call Debug ("line_len: " . line_len) + + call Debug ("brace_pos[2]:" . brace_pos[2]) + + let cursor_column=brace_pos[2] + + if line_len < 1 + call Debug ("line too short -> skip") + return 0 + endif + + if line_len == 1 + if line == " " + call Debug ("line is only one blank --> skip") + return + endif + endif + + let eol=1 + + if line_len > cursor_column + let line=strpart (line, 0, cursor_column-1) + "call Semi_typed () + let eol=0 + call Debug ("line before cursor: <" . line . ">" ) + endif + + let line=Chop_it (line) + + + if line == "0" + call Debug ("tag is 0 -> skip") + return + endif + + if strlen (line) < 1 + call Debug ("tag has zero length -> skip") + return + endif + + call Debug ("tag is:<" . line . ">") + + if line =~ '\a' + call Debug ("letters...") + else + call Debug ("no letters found -> skip") + return + endif + + if Display_tag (line) != "0" + + let brace_line=brace_pos[1] + let brace_column=brace_pos[2] + eol + + call Debug ("brace_line: " . brace_line . " brace_column: " . brace_column ) + + if !exists ("b:recent_braces") + call Debug ("no recent_braces") + let b:recent_braces=[[line, brace_line, brace_column]] + call Map_close_bracket() + call Map_semi() + else + call Debug ("resent_braces exist") + call add (b:recent_braces, [line, brace_line, brace_column]) + endif + endif + +endfunction + + +function! Map_comma (...) + + inoremap ( :call Open_bracket()( + +endfunction + +autocmd BufRead *.c call Map_comma() diff --git a/plugin/calendar.vim b/plugin/calendar.vim new file mode 100644 index 00000000..598dd3a1 --- /dev/null +++ b/plugin/calendar.vim @@ -0,0 +1,1328 @@ +"============================================================================= +" What Is This: Calendar +" File: calendar.vim +" Author: Yasuhiro Matsumoto +" Last Change: 27-Jan-2011. +" Version: 2.5 +" Thanks: +" SethMilliken : gave a hint for 2.4 +" bw1 : bug fix +" Ingo Karkat : bug fix +" Thinca : bug report, bug fix +" Yu Pei : bug report +" Per Winkvist : bug fix +" Serge (gentoosiast) Koksharov : bug fix +" Vitor Antunes : bug fix +" Olivier Mengue : bug fix +" Noel Henson : today action +" Per Winkvist : bug report +" Peter Findeisen : bug fix +" Chip Campbell : gave a hint for 1.3z +" PAN Shizhu : gave a hint for 1.3y +" Eric Wald : bug fix +" Sascha Wuestemann : advise +" Linas Vasiliauskas : bug report +" Per Winkvist : bug report +" Ronald Hoelwarth : gave a hint for 1.3s +" Vikas Agnihotri : bug report +" Steve Hall : gave a hint for 1.3q +" James Devenish : bug fix +" Carl Mueller : gave a hint for 1.3o +" Klaus Fabritius : bug fix +" Stucki : gave a hint for 1.3m +" Rosta : bug report +" Richard Bair : bug report +" Yin Hao Liew : bug report +" Bill McCarthy : bug fix and gave a hint +" Srinath Avadhanula : bug fix +" Ronald Hoellwarth : few advices +" Juan Orlandini : added higlighting of days with data +" Ray : bug fix +" Ralf.Schandl : gave a hint for 1.3 +" Bhaskar Karambelkar : bug fix +" Suresh Govindachar : gave a hint for 1.2, bug fix +" Michael Geddes : bug fix +" Leif Wickland : bug fix +" Usage: +" :Calendar +" show calendar at this year and this month +" :Calendar 8 +" show calendar at this year and given month +" :Calendar 2001 8 +" show calendar at given year and given month +" :CalendarH ... +" show horizontal calendar ... +" +" cal +" show calendar in normal mode +" caL +" show horizontal calendar ... +" ChangeLog: +" 2.5 : bug fix, 7.2 don't have relativenumber. +" 2.4 : added g:calendar_options. +" 2.3 : week number like ISO8601 +" g:calendar_monday and g:calendar_weeknm work together +" 2.2 : http://gist.github.com/355513#file_customizable_keymap.diff +" http://gist.github.com/355513#file_winfixwidth.diff +" 2.1 : bug fix, set filetype 'calendar'. +" 2.0 : bug fix, many bug fix and enhancements. +" 1.9 : bug fix, use nnoremap. +" 1.8 : bug fix, E382 when close diary. +" 1.7 : bug fix, week number was broken on 2008. +" 1.6 : added calendar_begin action. +" added calendar_end action. +" 1.5 : bug fix, fixed ruler formating with strpart. +" bug fix, using winfixheight. +" 1.4a : bug fix, week number was broken on 2005. +" added calendar_today action. +" bug fix, about wrapscan. +" bug fix, about today mark. +" bug fix, about today navigation. +" 1.4 : bug fix, and one improvement. +" bug 1: +" when marking the current date, there is not distinguished e.g. between +" 20041103 and 20040113, both dates are marked as today +" bug 2: +" the navigation mark "today" doesn't work +" improvement: +" the mapping t worked only when today was displayed, now it works always +" and redisplays the cuurent month and today +" 1.3z : few changes +" asign , for navigation. +" set ws for search navigation. +" add tag for GetLatestVimScripts(AutoInstall) +" 1.3y : bug fix, few changes +" changed color syntax name. (ex. CalNavi, see bottom of this) +" changed a map CalendarV for cal +" changed a map CalendarH for caL +" (competitive map for cvscommand.vim) +" the date on the right-hand side didn't work correctoly. +" make a map to rebuild Calendar window(r). +" 1.3x : bug fix +" viweek can't refer when not set calendar_weeknm. +" 1.3w : bug fix +" on leap year, week number decreases. +" 1.3v : bug fix +" add nowrapscan +" use s:bufautocommandsset for making title +" don't focus to navi when doubleclick bottom next>. +" 1.3u : bug fix +" when enter diary first time, +" it don't warn that you don't have diary directory. +" 1.3t : bug fix +" make sure the variables for help +" 1.3s : bug fix +" make a map CalendarV for ca +" add option calendar_navi_label +" see Additional: +" add option calendar_focus_today +" see Additional: +" add map ? for help +" 1.3r : bug fix +" if clicked navigator, cursor go to strange position. +" 1.3q : bug fix +" coundn't set calendar_navi +" in its horizontal direction +" 1.3p : bug fix +" coundn't edit diary when the calendar is +" in its horizontal direction +" 1.3o : add option calendar_mark, and delete calendar_rmark +" see Additional: +" add option calendar_navi +" see Additional: +" 1.3n : bug fix +" s:CalendarSign() should use filereadable(expand(sfile)). +" 1.3m : tuning +" using topleft or botright for opening Calendar. +" use filereadable for s:CalendarSign(). +" 1.3l : bug fix +" if set calendar_monday, it can see that Sep 1st is Sat +" as well as Aug 31st. +" 1.3k : bug fix +" it didn't escape the file name on calendar. +" 1.3j : support for fixed Gregorian +" added the part of Sep 1752. +" 1.3i : bug fix +" Calculation mistake for week number. +" 1.3h : add option for position of displaying '*' or '+'. +" see Additional: +" 1.3g : centering header +" add option for show name of era. +" see Additional: +" bug fix +" ca didn't show current month. +" 1.3f : bug fix +" there was yet another bug of today's sign. +" 1.3e : added usage for +" support handler for sign. +" see Additional: +" 1.3d : added higlighting of days that have calendar data associated +" with it. +" bug fix for calculates date. +" 1.3c : bug fix for MakeDir() +" if CalendarMakeDir(sfile) != 0 +" v +" if s:CalendarMakeDir(sfile) != 0 +" 1.3b : bug fix for calendar_monday. +" it didn't work g:calendar_monday correctly. +" add g:calendar_version. +" add argument on action handler. +" see Additional: +" 1.3a : bug fix for MakeDir(). +" it was not able to make directory. +" 1.3 : support handler for action. +" see Additional: +" 1.2g : bug fix for today's sign. +" it could not display today's sign correctly. +" 1.2f : bug fix for current Date. +" vtoday variable calculates date as 'YYYYMMDD' +" while the loop calculates date as 'YYYYMMD' i.e just 1 digit +" for date if < 10 so if current date is < 10 , the if condiction +" to check for current date fails and current date is not +" highlighted. +" simple solution changed vtoday calculation line divide the +" current-date by 1 so as to get 1 digit date. +" 1.2e : change the way for setting title. +" auto configuration for g:calendar_wruler with g:calendar_monday +" 1.2d : add option for show week number. +" let g:calendar_weeknm = 1 +" add separator if horizontal. +" change all option's name +" g:calendar_mnth -> g:calendar_mruler +" g:calendar_week -> g:calendar_wruler +" g:calendar_smnd -> g:calendar_monday +" 1.2c : add option for that the week starts with monday. +" let g:calendar_smnd = 1 +" 1.2b : bug fix for modifiable. +" setlocal nomodifiable (was set) +" 1.2a : add default options. +" nonumber,foldcolumn=0,nowrap... as making gap +" 1.2 : support wide display. +" add a command CalendarH +" add map +" 1.1c : extra. +" add a titlestring for today. +" 1.1b : bug fix by Michael Geddes. +" it happend when do ':Calender' twice +" 1.1a : fix misspell. +" Calender -> Calendar +" 1.1 : bug fix. +" it"s about strftime("%m") +" 1.0a : bug fix by Leif Wickland. +" it"s about strftime("%w") +" 1.0 : first release. +" TODO: +" add the option for diary which is separate or single file. +" Additional: +" *if you want to keep focus when goto next or prev calendar, +" add the following to your .vimrc: +" +" let g:calendar_focus_today = 1 +" +" *if you want to place the mark('*' or '+') after the day, +" add the following to your .vimrc: +" +" let g:calendar_mark = 'right' +" +" NOTE:you can set 'left', 'left-fit', 'right' for this option. +" +" *if you want to use navigator, +" add the following to your .vimrc: +" +" let g:calendar_navi = '' +" +" NOTE:you can set 'top', 'bottom', 'both' for this option. +" +" *if you want to replace navigator in your language, +" add the following to your .vimrc: +" +" let g:calendar_navi_label = 'Prev,Today,Next' +" +" NOTE:it must be separated with ','. +" +" *if you want to replace calendar header, +" add the following in your favorite language to your .vimrc: +" +" let g:calendar_erafmt = 'Heisei,-1988' " for Japanese +" (name of era and diff with A.D.) +" +" *if you want to replace calendar ruler, +" add the following in your favorite language to your .vimrc: +" +" let g:calendar_mruler = 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec' +" let g:calendar_wruler = 'Su Mo Tu We Th Fr Sa' +" +" *if you want the week to start with monday, add below to your .vimrc: +" +" let g:calendar_monday = 1 +" (You don't have to to change g:calendar_wruler!) +" +" *if you want to show week number, add this to your .vimrc: +" +" set g:calendar_weeknm as below +" +" let g:calendar_weeknm = 1 " WK01 +" let g:calendar_weeknm = 2 " WK 1 +" let g:calendar_weeknm = 3 " KW01 +" let g:calendar_weeknm = 4 " KW 1 +" +" *if you want to show the current date and time, add below to your .vimrc: +" +" let g:calendar_datetime = 'title' +" +" NOTE:you can set 'title', 'statusline', '' for this option. +" +" *if you want to hook calender when pressing enter, +" add this to your .vimrc: +" +" function MyCalAction(day,month,year,week,dir) +" " day : day you actioned +" " month : month you actioned +" " year : year you actioned +" " week : day of week (Mo=1 ... Su=7) +" " dir : direction of calendar +" endfunction +" let calendar_action = 'MyCalAction' +" +" also, Calendar call following actions when begin or end of display. +" them actions are called at one each time when it show 3 months display. +" +" function MyCalActionBegin() +" endfunction +" let calendar_begin = 'MyCalActionBegin' +" +" function MyCalActionEnd() +" endfunction +" let calendar_end = 'MyCalActionEnd' +" +" *if you want to show sign in calender, +" add this to your .vimrc: +" +" function MyCalSign(day,month,year) +" " day : day you actioned +" " month : month you actioned +" " year : year you actioned +" if a:day == 1 && a:month == 1 +" return 1 " happy new year +" else +" return 0 " or not +" endif +" endfunction +" let calendar_sign = 'MyCalSign' +" +" *if you want to hook calender when pressing 'today', +" add this to your .vimrc: +" +" function MyCalToday() +" endfunction +" let calendar_today = 'MyCalToday' +" +" *if you want to get the version of this. +" type below. +" +" :echo calendar_version +" GetLatestVimScripts: 52 1 :AutoInstall: calendar.vim + +let g:calendar_version = "2.5" +if &compatible + finish +endif + +if !exists("g:calendar_action") + let g:calendar_action = "CalendarDiary" +endif +if !exists("g:calendar_sign") + let g:calendar_sign = "CalendarSign" +endif +if !exists("g:calendar_mark") + \|| (g:calendar_mark != 'left' + \&& g:calendar_mark != 'left-fit' + \&& g:calendar_mark != 'right') + let g:calendar_mark = 'left' +endif +if !exists("g:calendar_navi") + \|| (g:calendar_navi != 'top' + \&& g:calendar_navi != 'bottom' + \&& g:calendar_navi != 'both' + \&& g:calendar_navi != '') + let g:calendar_navi = 'top' +endif +if !exists("g:calendar_navi_label") + let g:calendar_navi_label = "Prev,Today,Next" +endif +if !exists("g:calendar_diary") + let g:calendar_diary = "~/diary" +endif +if !exists("g:calendar_focus_today") + let g:calendar_focus_today = 0 +endif +if !exists("g:calendar_datetime") + \|| (g:calendar_datetime != '' + \&& g:calendar_datetime != 'title' + \&& g:calendar_datetime != 'statusline') + let g:calendar_datetime = 'title' +endif +if !exists("g:calendar_options") + let g:calendar_options="fdc=0 nonu" + if has("+relativenumber") + let g:calendar_options .= " nornu" + endif +endif + +"***************************************************************** +"* Calendar commands +"***************************************************************** +command! -nargs=* Calendar call Calendar(0,) +command! -nargs=* CalendarH call Calendar(1,) + +if !hasmapto("CalendarV") + nmap cal CalendarV +endif +if !hasmapto("CalendarH") + nmap caL CalendarH +endif +nnoremap CalendarV :cal Calendar(0) +nnoremap CalendarH :cal Calendar(1) + +"***************************************************************** +"* GetToken : get token from source with count +"*---------------------------------------------------------------- +"* src : source +"* dlm : delimiter +"* cnt : skip count +"***************************************************************** +function! s:GetToken(src,dlm,cnt) + let tokn_hit=0 " flag of found + let tokn_fnd='' " found path + let tokn_spl='' " token + let tokn_all=a:src " all source + + " safe for end + let tokn_all = tokn_all.a:dlm + while 1 + let tokn_spl = strpart(tokn_all,0,match(tokn_all,a:dlm)) + let tokn_hit = tokn_hit + 1 + if tokn_hit == a:cnt + return tokn_spl + endif + let tokn_all = strpart(tokn_all,strlen(tokn_spl.a:dlm)) + if tokn_all == '' + break + endif + endwhile + return '' +endfunction + +"***************************************************************** +"* CalendarDoAction : call the action handler function +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarDoAction(...) + " for navi + if exists('g:calendar_navi') + let navi = (a:0 > 0)? a:1 : expand("") + let curl = line(".") + if navi == '<' . s:GetToken(g:calendar_navi_label, ',', 1) + if b:CalendarMonth > 1 + call Calendar(b:CalendarDir, b:CalendarYear, b:CalendarMonth-1) + else + call Calendar(b:CalendarDir, b:CalendarYear-1, 12) + endif + elseif navi == s:GetToken(g:calendar_navi_label, ',', 3) . '>' + if b:CalendarMonth < 12 + call Calendar(b:CalendarDir, b:CalendarYear, b:CalendarMonth+1) + else + call Calendar(b:CalendarDir, b:CalendarYear+1, 1) + endif + elseif navi == s:GetToken(g:calendar_navi_label, ',', 2) + call Calendar(b:CalendarDir) + if exists('g:calendar_today') + exe "call " . g:calendar_today . "()" + endif + else + let navi = '' + endif + if navi != '' + if g:calendar_focus_today == 1 && search("\*","w") > 0 + silent execute "normal! gg/\*\" + return + else + if curl < line('$')/2 + silent execute "normal! gg0/".navi."\" + else + silent execute "normal! G$?".navi."\" + endif + return + endif + endif + endif + + " if no action defined return + if !exists("g:calendar_action") || g:calendar_action == "" + return + endif + + if b:CalendarDir + let dir = 'H' + if exists('g:calendar_weeknm') + let cnr = col('.') - (col('.')%(24+5)) + 1 + else + let cnr = col('.') - (col('.')%(24)) + 1 + endif + let week = ((col(".") - cnr - 1 + cnr/49) / 3) + else + let dir = 'V' + let cnr = 1 + let week = ((col(".")+1) / 3) - 1 + endif + let lnr = 1 + let hdr = 1 + while 1 + if lnr > line('.') + break + endif + let sline = getline(lnr) + if sline =~ '^\s*$' + let hdr = lnr + 1 + endif + let lnr = lnr + 1 + endwhile + let lnr = line('.') + if(exists('g:calendar_monday')) + let week = week + 1 + elseif(week == 0) + let week = 7 + endif + if lnr-hdr < 2 + return + endif + let sline = substitute(strpart(getline(hdr),cnr,21),'\s*\(.*\)\s*','\1','') + if (col(".")-cnr) > 21 + return + endif + + " extract day + if g:calendar_mark == 'right' && col('.') > 1 + normal! h + let day = matchstr(expand(""), '[^0].*') + normal! l + else + let day = matchstr(expand(""), '[^0].*') + endif + if day == 0 + return + endif + " extract year and month + if exists('g:calendar_erafmt') && g:calendar_erafmt !~ "^\s*$" + let year = matchstr(substitute(sline, '/.*', '', ''), '\d\+') + let month = matchstr(substitute(sline, '.*/\(\d\d\=\).*', '\1', ""), '[^0].*') + if g:calendar_erafmt =~ '.*,[+-]*\d\+' + let veranum=substitute(g:calendar_erafmt,'.*,\([+-]*\d\+\)','\1','') + if year-veranum > 0 + let year=year-veranum + endif + endif + else + let year = matchstr(substitute(sline, '/.*', '', ''), '[^0].*') + let month = matchstr(substitute(sline, '\d*/\(\d\d\=\).*', '\1', ""), '[^0].*') + endif + " call the action function + exe "call " . g:calendar_action . "(day, month, year, week, dir)" +endfunc + +"***************************************************************** +"* Calendar : build calendar +"*---------------------------------------------------------------- +"* a1 : direction +"* a2 : month(if given a3, it's year) +"* a3 : if given, it's month +"***************************************************************** +function! Calendar(...) + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ ready for build + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " remember today + " divide strftime('%d') by 1 so as to get "1,2,3 .. 9" instead of "01, 02, 03 .. 09" + let vtoday = strftime('%Y').strftime('%m').strftime('%d') + + " get arguments + if a:0 == 0 + let dir = 0 + let vyear = strftime('%Y') + let vmnth = matchstr(strftime('%m'), '[^0].*') + elseif a:0 == 1 + let dir = a:1 + let vyear = strftime('%Y') + let vmnth = matchstr(strftime('%m'), '[^0].*') + elseif a:0 == 2 + let dir = a:1 + let vyear = strftime('%Y') + let vmnth = matchstr(a:2, '^[^0].*') + else + let dir = a:1 + let vyear = a:2 + let vmnth = matchstr(a:3, '^[^0].*') + endif + + " remember constant + let vmnth_org = vmnth + let vyear_org = vyear + + " start with last month + let vmnth = vmnth - 1 + if vmnth < 1 + let vmnth = 12 + let vyear = vyear - 1 + endif + + " reset display variables + let vdisplay1 = '' + let vheight = 1 + let vmcnt = 0 + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build display + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + if exists("g:calendar_begin") + exe "call " . g:calendar_begin . "()" + endif + while vmcnt < 3 + let vcolumn = 22 + let vnweek = -1 + "-------------------------------------------------------------- + "--- calculating + "-------------------------------------------------------------- + " set boundary of the month + if vmnth == 1 + let vmdays = 31 + let vparam = 1 + let vsmnth = 'Jan' + elseif vmnth == 2 + let vmdays = 28 + let vparam = 32 + let vsmnth = 'Feb' + elseif vmnth == 3 + let vmdays = 31 + let vparam = 60 + let vsmnth = 'Mar' + elseif vmnth == 4 + let vmdays = 30 + let vparam = 91 + let vsmnth = 'Apr' + elseif vmnth == 5 + let vmdays = 31 + let vparam = 121 + let vsmnth = 'May' + elseif vmnth == 6 + let vmdays = 30 + let vparam = 152 + let vsmnth = 'Jun' + elseif vmnth == 7 + let vmdays = 31 + let vparam = 182 + let vsmnth = 'Jul' + elseif vmnth == 8 + let vmdays = 31 + let vparam = 213 + let vsmnth = 'Aug' + elseif vmnth == 9 + let vmdays = 30 + let vparam = 244 + let vsmnth = 'Sep' + elseif vmnth == 10 + let vmdays = 31 + let vparam = 274 + let vsmnth = 'Oct' + elseif vmnth == 11 + let vmdays = 30 + let vparam = 305 + let vsmnth = 'Nov' + elseif vmnth == 12 + let vmdays = 31 + let vparam = 335 + let vsmnth = 'Dec' + else + echo 'Invalid Year or Month' + return + endif + if vyear % 400 == 0 + if vmnth == 2 + let vmdays = 29 + elseif vmnth >= 3 + let vparam = vparam + 1 + endif + elseif vyear % 100 == 0 + if vmnth == 2 + let vmdays = 28 + endif + elseif vyear % 4 == 0 + if vmnth == 2 + let vmdays = 29 + elseif vmnth >= 3 + let vparam = vparam + 1 + endif + endif + + " calc vnweek of the day + if vnweek == -1 + let vnweek = ( vyear * 365 ) + vparam + let vnweek = vnweek + ( vyear/4 ) - ( vyear/100 ) + ( vyear/400 ) + if vyear % 4 == 0 + if vyear % 100 != 0 || vyear % 400 == 0 + let vnweek = vnweek - 1 + endif + endif + let vnweek = vnweek - 1 + endif + + " fix Gregorian + if vyear <= 1752 + let vnweek = vnweek - 3 + endif + + let vnweek = vnweek % 7 + + if exists('g:calendar_monday') + " if given g:calendar_monday, the week start with monday + if vnweek == 0 + let vnweek = 7 + endif + let vnweek = vnweek - 1 + endif + + if exists('g:calendar_weeknm') + " if given g:calendar_weeknm, show week number(ref:ISO8601) + + "vparam <= 1. day of month + "vnweek <= 1. weekday of month (0-6) + "viweek <= number of week + "vfweek <= 1. day of year + + " mo di mi do fr sa so + " 6 5 4 3 2 1 0 vfweek + " 0 1 2 3 4 5 6 vnweek + + let vfweek =((vparam % 7) -vnweek+ 14-2) % 7 + let viweek = (vparam - vfweek-2+7 ) / 7 +1 + + if vfweek < 3 + let viweek = viweek - 1 + endif + + "vfweekl <=year length + let vfweekl = 52 + if (vfweek == 3) + let vfweekl = 53 + endif + + if viweek == 0 + let viweek = 52 + if ((vfweek == 2) && (((vyear-1) % 4) !=0)) + \ || ((vfweek == 1) && (((vyear-1) % 4) ==0)) + let viweek = 53 + endif + endif + + let vcolumn = vcolumn + 5 + endif + + "-------------------------------------------------------------- + "--- displaying + "-------------------------------------------------------------- + " build header + if exists('g:calendar_erafmt') && g:calendar_erafmt !~ "^\s*$" + if g:calendar_erafmt =~ '.*,[+-]*\d\+' + let veranum=substitute(g:calendar_erafmt,'.*,\([+-]*\d\+\)','\1','') + if vyear+veranum > 0 + let vdisplay2=substitute(g:calendar_erafmt,'\(.*\),.*','\1','') + let vdisplay2=vdisplay2.(vyear+veranum).'/'.vmnth.'(' + else + let vdisplay2=vyear.'/'.vmnth.'(' + endif + else + let vdisplay2=vyear.'/'.vmnth.'(' + endif + let vdisplay2=strpart(" ", + \ 1,(vcolumn-strlen(vdisplay2))/2-2).vdisplay2 + else + let vdisplay2=vyear.'/'.vmnth.'(' + let vdisplay2=strpart(" ", + \ 1,(vcolumn-strlen(vdisplay2))/2-2).vdisplay2 + endif + if exists('g:calendar_mruler') && g:calendar_mruler !~ "^\s*$" + let vdisplay2=vdisplay2.s:GetToken(g:calendar_mruler,',',vmnth).')'."\n" + else + let vdisplay2=vdisplay2.vsmnth.')'."\n" + endif + let vwruler = "Su Mo Tu We Th Fr Sa" + if exists('g:calendar_wruler') && g:calendar_wruler !~ "^\s*$" + let vwruler = g:calendar_wruler + endif + if exists('g:calendar_monday') + let vwruler = strpart(vwruler,stridx(vwruler, ' ') + 1).' '.strpart(vwruler,0,stridx(vwruler, ' ')) + endif + let vdisplay2 = vdisplay2.' '.vwruler."\n" + if g:calendar_mark == 'right' + let vdisplay2 = vdisplay2.' ' + endif + + " build calendar + let vinpcur = 0 + while (vinpcur < vnweek) + let vdisplay2=vdisplay2.' ' + let vinpcur = vinpcur + 1 + endwhile + let vdaycur = 1 + while (vdaycur <= vmdays) + if vmnth < 10 + let vtarget =vyear."0".vmnth + else + let vtarget =vyear.vmnth + endif + if vdaycur < 10 + let vtarget = vtarget."0".vdaycur + else + let vtarget = vtarget.vdaycur + endif + if exists("g:calendar_sign") && g:calendar_sign != "" + exe "let vsign = " . g:calendar_sign . "(vdaycur, vmnth, vyear)" + if vsign != "" + let vsign = vsign[0] + if vsign !~ "[+!#$%&@?]" + let vsign = "+" + endif + endif + else + let vsign = '' + endif + + " show mark + if g:calendar_mark == 'right' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + let vdisplay2=vdisplay2.vdaycur + elseif g:calendar_mark == 'left-fit' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + endif + if vtarget == vtoday + let vdisplay2=vdisplay2.'*' + elseif vsign != '' + let vdisplay2=vdisplay2.vsign + else + let vdisplay2=vdisplay2.' ' + endif + if g:calendar_mark == 'left' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + let vdisplay2=vdisplay2.vdaycur + endif + if g:calendar_mark == 'left-fit' + let vdisplay2=vdisplay2.vdaycur + endif + let vdaycur = vdaycur + 1 + + " fix Gregorian + if vyear == 1752 && vmnth == 9 && vdaycur == 3 + let vdaycur = 14 + endif + + let vinpcur = vinpcur + 1 + if vinpcur % 7 == 0 + if exists('g:calendar_weeknm') + if g:calendar_mark != 'right' + let vdisplay2=vdisplay2.' ' + endif + " if given g:calendar_weeknm, show week number + if viweek < 10 + if g:calendar_weeknm == 1 + let vdisplay2=vdisplay2.'WK0'.viweek + elseif g:calendar_weeknm == 2 + let vdisplay2=vdisplay2.'WK '.viweek + elseif g:calendar_weeknm == 3 + let vdisplay2=vdisplay2.'KW0'.viweek + elseif g:calendar_weeknm == 4 + let vdisplay2=vdisplay2.'KW '.viweek + endif + else + if g:calendar_weeknm <= 2 + let vdisplay2=vdisplay2.'WK'.viweek + else + let vdisplay2=vdisplay2.'KW'.viweek + endif + endif + let viweek = viweek + 1 + + if viweek > vfweekl + let viweek = 1 + endif + + endif + let vdisplay2=vdisplay2."\n" + if g:calendar_mark == 'right' + let vdisplay2 = vdisplay2.' ' + endif + endif + endwhile + + " if it is needed, fill with space + if vinpcur % 7 + while (vinpcur % 7 != 0) + let vdisplay2=vdisplay2.' ' + let vinpcur = vinpcur + 1 + endwhile + if exists('g:calendar_weeknm') + if g:calendar_mark != 'right' + let vdisplay2=vdisplay2.' ' + endif + if viweek < 10 + if g:calendar_weeknm == 1 + let vdisplay2=vdisplay2.'WK0'.viweek + elseif g:calendar_weeknm == 2 + let vdisplay2=vdisplay2.'WK '.viweek + elseif g:calendar_weeknm == 3 + let vdisplay2=vdisplay2.'KW0'.viweek + elseif g:calendar_weeknm == 4 + let vdisplay2=vdisplay2.'KW '.viweek + endif + else + if g:calendar_weeknm <= 2 + let vdisplay2=vdisplay2.'WK'.viweek + else + let vdisplay2=vdisplay2.'KW'.viweek + endif + endif + endif + endif + + " build display + let vstrline = '' + if dir + " for horizontal + "-------------------------------------------------------------- + " +---+ +---+ +------+ + " | | | | | | + " | 1 | + | 2 | = | 1' | + " | | | | | | + " +---+ +---+ +------+ + "-------------------------------------------------------------- + let vtokline = 1 + while 1 + let vtoken1 = s:GetToken(vdisplay1,"\n",vtokline) + let vtoken2 = s:GetToken(vdisplay2,"\n",vtokline) + if vtoken1 == '' && vtoken2 == '' + break + endif + while strlen(vtoken1) < (vcolumn+1)*vmcnt + if strlen(vtoken1) % (vcolumn+1) == 0 + let vtoken1 = vtoken1.'|' + else + let vtoken1 = vtoken1.' ' + endif + endwhile + let vstrline = vstrline.vtoken1.'|'.vtoken2.' '."\n" + let vtokline = vtokline + 1 + endwhile + let vdisplay1 = vstrline + let vheight = vtokline-1 + else + " for virtical + "-------------------------------------------------------------- + " +---+ +---+ +---+ + " | 1 | + | 2 | = | | + " +---+ +---+ | 1'| + " | | + " +---+ + "-------------------------------------------------------------- + let vtokline = 1 + while 1 + let vtoken1 = s:GetToken(vdisplay1,"\n",vtokline) + if vtoken1 == '' + break + endif + let vstrline = vstrline.vtoken1."\n" + let vtokline = vtokline + 1 + let vheight = vheight + 1 + endwhile + if vstrline != '' + let vstrline = vstrline.' '."\n" + let vheight = vheight + 1 + endif + let vtokline = 1 + while 1 + let vtoken2 = s:GetToken(vdisplay2,"\n",vtokline) + if vtoken2 == '' + break + endif + while strlen(vtoken2) < vcolumn + let vtoken2 = vtoken2.' ' + endwhile + let vstrline = vstrline.vtoken2."\n" + let vtokline = vtokline + 1 + let vheight = vtokline + 1 + endwhile + let vdisplay1 = vstrline + endif + let vmnth = vmnth + 1 + let vmcnt = vmcnt + 1 + if vmnth > 12 + let vmnth = 1 + let vyear = vyear + 1 + endif + endwhile + if exists("g:calendar_end") + exe "call " . g:calendar_end . "()" + endif + if a:0 == 0 + return vdisplay1 + endif + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build window + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " make window + let vwinnum=bufnr('__Calendar') + if getbufvar(vwinnum, 'Calendar')=='Calendar' + let vwinnum=bufwinnr(vwinnum) + else + let vwinnum=-1 + endif + + if vwinnum >= 0 + " if already exist + if vwinnum != bufwinnr('%') + exe vwinnum . 'wincmd w' + endif + setlocal modifiable + silent %d _ + else + " make title + if g:calendar_datetime == "title" && (!exists('s:bufautocommandsset')) + auto BufEnter *Calendar let b:sav_titlestring = &titlestring | let &titlestring = '%{strftime("%c")}' + auto BufLeave *Calendar let &titlestring = b:sav_titlestring + let s:bufautocommandsset=1 + endif + + if exists('g:calendar_navi') && dir + if g:calendar_navi == 'both' + let vheight = vheight + 4 + else + let vheight = vheight + 2 + endif + endif + + " or not + if dir + silent execute 'bo '.vheight.'split __Calendar' + setlocal winfixheight + else + silent execute 'to '.vcolumn.'vsplit __Calendar' + setlocal winfixwidth + endif + call s:CalendarBuildKeymap(dir, vyear, vmnth) + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=delete + silent! exe "setlocal " . g:calendar_options + let nontext_columns = &foldcolumn + &nu * &numberwidth + if has("+relativenumber") + let nontext_columns += &rnu * &numberwidth + endif + " Without this, the 'sidescrolloff' setting may cause the left side of the + " calendar to disappear if the last inserted element is near the right + " window border. + setlocal nowrap + setlocal norightleft + setlocal modifiable + setlocal nolist + let b:Calendar='Calendar' + setlocal filetype=calendar + " is this a vertical (0) or a horizontal (1) split? + exe vcolumn + nontext_columns . "wincmd |" + endif + if g:calendar_datetime == "statusline" + setlocal statusline=%{strftime('%c')} + endif + let b:CalendarDir=dir + let b:CalendarYear = vyear_org + let b:CalendarMonth = vmnth_org + + " navi + if exists('g:calendar_navi') + let navi_label = '<' + \.s:GetToken(g:calendar_navi_label, ',', 1).' ' + \.s:GetToken(g:calendar_navi_label, ',', 2).' ' + \.s:GetToken(g:calendar_navi_label, ',', 3).'>' + if dir + let navcol = vcolumn + (vcolumn-strlen(navi_label)+2)/2 + else + let navcol = (vcolumn-strlen(navi_label)+2)/2 + endif + if navcol < 3 + let navcol = 3 + endif + + if g:calendar_navi == 'top' + execute "normal gg".navcol."i " + silent exec "normal! a".navi_label."\\" + silent put! =vdisplay1 + endif + if g:calendar_navi == 'bottom' + silent put! =vdisplay1 + silent exec "normal! Gi\" + execute "normal ".navcol."i " + silent exec "normal! a".navi_label + endif + if g:calendar_navi == 'both' + execute "normal gg".navcol."i " + silent exec "normal! a".navi_label."\\" + silent put! =vdisplay1 + silent exec "normal! Gi\" + execute "normal ".navcol."i " + silent exec "normal! a".navi_label + endif + else + silent put! =vdisplay1 + endif + + setlocal nomodifiable + " In case we've gotten here from insert mode (via :Calendar)... + stopinsert + + let vyear = vyear_org + let vmnth = vmnth_org + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build highlight + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " today + syn clear + if g:calendar_mark =~ 'left-fit' + syn match CalToday display "\s*\*\d*" + syn match CalMemo display "\s*[+!#$%&@?]\d*" + elseif g:calendar_mark =~ 'right' + syn match CalToday display "\d*\*\s*" + syn match CalMemo display "\d*[+!#$%&@?]\s*" + else + syn match CalToday display "\*\s*\d*" + syn match CalMemo display "[+!#$%&@?]\s*\d*" + endif + " header + syn match CalHeader display "[^ ]*\d\+\/\d\+([^)]*)" + + " navi + if exists('g:calendar_navi') + exec "silent! syn match CalNavi display \"\\(<" + \.s:GetToken(g:calendar_navi_label, ',', 1)."\\|" + \.s:GetToken(g:calendar_navi_label, ',', 3).">\\)\"" + exec "silent! syn match CalNavi display \"\\s" + \.s:GetToken(g:calendar_navi_label, ',', 2)."\\s\"hs=s+1,he=e-1" + endif + + " saturday, sunday + let dayorspace = '\(\*\|\s\)\(\s\|\d\)\(\s\|\d\)' + if !exists('g:calendar_weeknm') || g:calendar_weeknm <= 2 + let wknmstring = '\(\sWK[0-9\ ]\d\)*' + else + let wknmstring = '\(\sKW[0-9\ ]\d\)*' + endif + let eolnstring = '\s\(|\|$\)' + if exists('g:calendar_monday') + execute "syn match CalSaturday display \'" + \.dayorspace.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + else + if dir + execute "syn match CalSaturday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'\|" + \.dayorspace."\'ms=s+2,me=s+4" + else + execute "syn match CalSaturday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'^" + \.dayorspace."\'ms=s+1,me=s+3" + endif + endif + + " week number + if !exists('g:calendar_weeknm') || g:calendar_weeknm <= 2 + syn match CalWeeknm display "WK[0-9\ ]\d" + else + syn match CalWeeknm display "KW[0-9\ ]\d" + endif + + " ruler + execute 'syn match CalRuler "'.vwruler.'"' + + if search("\*","w") > 0 + silent execute "normal! gg/\*\" + endif + + return '' +endfunction + +"***************************************************************** +"* CalendarMakeDir : make directory +"*---------------------------------------------------------------- +"* dir : directory +"***************************************************************** +function! s:CalendarMakeDir(dir) + if(has("unix")) + call system("mkdir " . a:dir) + let rc = v:shell_error + elseif(has("win16") || has("win32") || has("win95") || + \has("dos16") || has("dos32") || has("os2")) + call system("mkdir \"" . a:dir . "\"") + let rc = v:shell_error + else + let rc = 1 + endif + if rc != 0 + call confirm("can't create directory : " . a:dir, "&OK") + endif + return rc +endfunc + +"***************************************************************** +"* CalendarDiary : calendar hook function +"*---------------------------------------------------------------- +"* day : day you actioned +"* month : month you actioned +"* year : year you actioned +"***************************************************************** +function! s:CalendarDiary(day, month, year, week, dir) + " build the file name and create directories as needed + if !isdirectory(expand(g:calendar_diary)) + call confirm("please create diary directory : ".g:calendar_diary, 'OK') + return + endif + let sfile = expand(g:calendar_diary) . "/" . a:year + if isdirectory(sfile) == 0 + if s:CalendarMakeDir(sfile) != 0 + return + endif + endif + let sfile = sfile . "/" . a:month + if isdirectory(sfile) == 0 + if s:CalendarMakeDir(sfile) != 0 + return + endif + endif + let sfile = expand(sfile) . "/" . a:day . ".cal" + let sfile = substitute(sfile, ' ', '\\ ', 'g') + let vbufnr = bufnr('__Calendar') + + " load the file + exe "sp " . sfile + setlocal ft=calendar + let dir = getbufvar(vbufnr, "CalendarDir") + let vyear = getbufvar(vbufnr, "CalendarYear") + let vmnth = getbufvar(vbufnr, "CalendarMonth") + exe "auto BufDelete ".escape(sfile, ' \\')." call Calendar(" . dir . "," . vyear . "," . vmnth . ")" +endfunc + +"***************************************************************** +"* CalendarSign : calendar sign function +"*---------------------------------------------------------------- +"* day : day of sign +"* month : month of sign +"* year : year of sign +"***************************************************************** +function! s:CalendarSign(day, month, year) + let sfile = g:calendar_diary."/".a:year."/".a:month."/".a:day.".cal" + return filereadable(expand(sfile)) +endfunction + +"***************************************************************** +"* CalendarVar : get variable +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarVar(var) + if !exists(a:var) + return '' + endif + exec 'return ' . a:var +endfunction + +"***************************************************************** +"* CalendarBuildKeymap : build keymap +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarBuildKeymap(dir, vyear, vmnth) + " make keymap + execute 'nnoremap q :closewincmd p' + + execute 'nnoremap CalendarDoAction :call CalendarDoAction()' + execute 'nnoremap CalendarDoAction :call CalendarDoAction()' + execute 'nnoremap CalendarGotoToday :call Calendar(b:CalendarDir)' + execute 'nnoremap CalendarShowHelp :call CalendarHelp()' + execute 'nnoremap CalendarReDisplay :call Calendar(' . a:dir . ',' . a:vyear . ',' . a:vmnth . ')' + let pnav = s:GetToken(g:calendar_navi_label, ',', 1) + let nnav = s:GetToken(g:calendar_navi_label, ',', 3) + execute 'nnoremap CalendarGotoPrevMonth :call CalendarDoAction("<' . pnav . '")' + execute 'nnoremap CalendarGotoNextMonth :call CalendarDoAction("' . nnav . '>")' + execute 'nnoremap CalendarGotoPrevYear :call Calendar('.a:dir.','.(a:vyear-1).','.a:vmnth.')' + execute 'nnoremap CalendarGotoNextYear :call Calendar('.a:dir.','.(a:vyear+1).','.a:vmnth.')' + + nmap CalendarDoAction + nmap <2-LeftMouse> CalendarDoAction + nmap t CalendarGotoToday + nmap ? CalendarShowHelp + nmap r CalendarReDisplay + + nmap CalendarGotoPrevMonth + nmap CalendarGotoNextMonth + nmap CalendarGotoPrevYear + nmap CalendarGotoNextYear +endfunction + +"***************************************************************** +"* CalendarHelp : show help for Calendar +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarHelp() + echohl None + echo 'Calendar version ' . g:calendar_version + echohl SpecialKey + echo ' : goto prev month' + echo ' : goto next month' + echo ' : goto prev year' + echo ' : goto next year' + echo 't : goto today' + echo 'q : close window' + echo 'r : re-display window' + echo '? : show this help' + if g:calendar_action == "CalendarDiary" + echo ' : show diary' + endif + echo '' + echohl Question + echo 'calendar_erafmt=' . s:CalendarVar('g:calendar_erafmt') + echo 'calendar_mruler=' . s:CalendarVar('g:calendar_mruler') + echo 'calendar_wruler=' . s:CalendarVar('g:calendar_wruler') + echo 'calendar_weeknm=' . s:CalendarVar('g:calendar_weeknm') + echo 'calendar_navi_label=' . s:CalendarVar('g:calendar_navi_label') + echo 'calendar_diary=' . s:CalendarVar('g:calendar_diary') + echo 'calendar_mark=' . s:CalendarVar('g:calendar_mark') + echo 'calendar_navi=' . s:CalendarVar('g:calendar_navi') + echohl MoreMsg + echo "[Hit any key]" + echohl None + call getchar() + redraw! +endfunction + +hi def link CalNavi Search +hi def link CalSaturday Statement +hi def link CalSunday Type +hi def link CalRuler StatusLine +hi def link CalWeeknm Comment +hi def link CalToday Directory +hi def link CalHeader Special +hi def link CalMemo Identifier diff --git a/plugin/cscope_maps.vim b/plugin/cscope_maps.vim new file mode 100644 index 00000000..c577b459 --- /dev/null +++ b/plugin/cscope_maps.vim @@ -0,0 +1,165 @@ +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" CSCOPE settings for vim +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" +" This file contains some boilerplate settings for vim's cscope interface, +" plus some keyboard mappings that I've found useful. +" +" USAGE: +" -- vim 6: Stick this file in your ~/.vim/plugin directory (or in a +" 'plugin' directory in some other directory that is in your +" 'runtimepath'. +" +" -- vim 5: Stick this file somewhere and 'source cscope.vim' it from +" your ~/.vimrc file (or cut and paste it into your .vimrc). +" +" NOTE: +" These key maps use multiple keystrokes (2 or 3 keys). If you find that vim +" keeps timing you out before you can complete them, try changing your timeout +" settings, as explained below. +" +" Happy cscoping, +" +" Jason Duell jduell@alumni.princeton.edu 2002/3/7 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + +" This tests to see if vim was configured with the '--enable-cscope' option +" when it was compiled. If it wasn't, time to recompile vim... +if has("cscope") + + """"""""""""" Standard cscope/vim boilerplate + + " use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t' + set cscopetag + + " check cscope for definition of a symbol before checking ctags: set to 1 + " if you want the reverse search order. + set csto=0 + + " add any cscope database in current directory + if filereadable("cscope.out") + cs add cscope.out + " else add the database pointed to by environment variable + elseif $CSCOPE_DB != "" + cs add $CSCOPE_DB + endif + + " show msg when any other cscope db added + set cscopeverbose + + + """"""""""""" My cscope/vim key mappings + " + " The following maps all invoke one of the following cscope search types: + " + " 's' symbol: find all references to the token under cursor + " 'g' global: find global definition(s) of the token under cursor + " 'c' calls: find all calls to the function name under cursor + " 't' text: find all instances of the text under cursor + " 'e' egrep: egrep search for the word under cursor + " 'f' file: open the filename under cursor + " 'i' includes: find files that include the filename under cursor + " 'd' called: find functions that function under cursor calls + " + " Below are three sets of the maps: one set that just jumps to your + " search result, one that splits the existing vim window horizontally and + " diplays your search result in the new window, and one that does the same + " thing, but does a vertical split instead (vim 6 only). + " + " I've used CTRL-\ and CTRL-@ as the starting keys for these maps, as it's + " unlikely that you need their default mappings (CTRL-\'s default use is + " as part of CTRL-\ CTRL-N typemap, which basically just does the same + " thing as hitting 'escape': CTRL-@ doesn't seem to have any default use). + " If you don't like using 'CTRL-@' or CTRL-\, , you can change some or all + " of these maps to use other keys. One likely candidate is 'CTRL-_' + " (which also maps to CTRL-/, which is easier to type). By default it is + " used to switch between Hebrew and English keyboard mode. + " + " All of the maps involving the macro use '^$': this is so + " that searches over '#include " return only references to + " 'time.h', and not 'sys/time.h', etc. (by default cscope will return all + " files that contain 'time.h' as part of their name). + + + " To do the first type of search, hit 'CTRL-\', followed by one of the + " cscope search types above (s,g,c,t,e,f,i,d). The result of your cscope + " search will be displayed in the current window. You can use CTRL-T to + " go back to where you were before the search. + " + + nmap s :cs find s =expand("") + nmap g :cs find g =expand("") + nmap c :cs find c =expand("") + nmap t :cs find t =expand("") + nmap e :cs find e =expand("") + nmap f :cs find f =expand("") + nmap i :cs find i ^=expand("")$ + nmap d :cs find d =expand("") + + + " Using 'CTRL-spacebar' (intepreted as CTRL-@ by vim) then a search type + " makes the vim window split horizontally, with search result displayed in + " the new window. + " + " (Note: earlier versions of vim may not have the :scs command, but it + " can be simulated roughly via: + " nmap s :cs find s =expand("") + + nmap s :scs find s =expand("") + nmap g :scs find g =expand("") + nmap c :scs find c =expand("") + nmap t :scs find t =expand("") + nmap e :scs find e =expand("") + nmap f :scs find f =expand("") + nmap i :scs find i ^=expand("")$ + nmap d :scs find d =expand("") + + + " Hitting CTRL-space *twice* before the search type does a vertical + " split instead of a horizontal one (vim 6 and up only) + " + " (Note: you may wish to put a 'set splitright' in your .vimrc + " if you prefer the new window on the right instead of the left + + nmap s :vert scs find s =expand("") + nmap g :vert scs find g =expand("") + nmap c :vert scs find c =expand("") + nmap t :vert scs find t =expand("") + nmap e :vert scs find e =expand("") + nmap f :vert scs find f =expand("") + nmap i :vert scs find i ^=expand("")$ + nmap d :vert scs find d =expand("") + + + """"""""""""" key map timeouts + " + " By default Vim will only wait 1 second for each keystroke in a mapping. + " You may find that too short with the above typemaps. If so, you should + " either turn off mapping timeouts via 'notimeout'. + " + "set notimeout + " + " Or, you can keep timeouts, by uncommenting the timeoutlen line below, + " with your own personal favorite value (in milliseconds): + " + "set timeoutlen=4000 + " + " Either way, since mapping timeout settings by default also set the + " timeouts for multicharacter 'keys codes' (like ), you should also + " set ttimeout and ttimeoutlen: otherwise, you will experience strange + " delays as vim waits for a keystroke after you hit ESC (it will be + " waiting to see if the ESC is actually part of a key code like ). + " + "set ttimeout + " + " personally, I find a tenth of a second to work well for key code + " timeouts. If you experience problems and have a slow terminal or network + " connection, set it higher. If you don't set ttimeoutlen, the value for + " timeoutlent (default: 1000 = 1 second, which is sluggish) is used. + " + "set ttimeoutlen=100 + +endif + + diff --git a/plugin/echofunc.vim b/plugin/echofunc.vim new file mode 100644 index 00000000..19eea1c0 --- /dev/null +++ b/plugin/echofunc.vim @@ -0,0 +1,557 @@ +"================================================== +" File: echofunc.vim +" Brief: Echo the function declaration in +" the command line for C/C++, as well +" as other languages that ctags +" supports. +" Authors: Ming Bai , +" Wu Yongwei +" Last Change: 2012-02-04 19:18:00 +" Version: 2.0 +" +" Install: 1. Put echofunc.vim to /plugin directory. +" 2. Use the command below to create tags +" file including the language and +" signature fields. +" ctags -R --fields=+lS . +" +" Usage: When you type '(' after a function name +" in insert mode, the function declaration +" will be displayed in the command line +" automatically. Then you may use Alt+- and +" Alt+= (configurable via EchoFuncKeyPrev +" and EchoFuncKeyNext) to cycle between +" function declarations (if exists). +" +" Another feature is to provide a balloon tip +" when the mouse cursor hovers a function name, +" macro name, etc. This works with when +" +balloon_eval is compiled in. +" +" Because the message line often cleared by +" some other plugins (e.g. ominicomplete), an +" other choice is to show message in status line. +" First, add %{EchoFuncGetStatusLine()} to +" your 'statusline' option. +" Second, add the following line to your vimrc +" let g:EchoFuncShowOnStatus = 1 +" to avoid echoing function name in message line. +" +" Options: g:EchoFuncLangsDict +" Dictionary to map the Vim file types to +" tags languages that should be used. You do +" not need to touch it in most cases. +" +" g:EchoFuncLangsUsed +" File types to enable echofunc, in case you +" do not want to use EchoFunc on all file +" types supported. Example: +" let g:EchoFuncLangsUsed = ["java","cpp"] +" +" g:EchoFuncMaxBalloonDeclarations +" Maximum lines to display in balloon declarations. +" +" g:EchoFuncKeyNext +" Key to echo the next function. +" +" g:EchoFuncKeyPrev +" Key to echo the previous function. +" +" g:EchoFuncShowOnStatus +" Show function name on status line. NOTE, +" you should manually add %{EchoFuncGetStatusLine()} +" to your 'statusline' option. +" +" g:EchoFuncAutoStartBalloonDeclaration +" Automatically start balloon declaration if not 0. +" +" g:EchoFuncPathMappingEnabled +" g:EchoFuncPathMapping +" The new feature added by Zhao Cai provides ability +" to shorten file path in some specific directory. e.g. +" /home/username/veryveryvery/long/file/path/blabla +" could be showed as +" ~/veryveryvery/long/file/path/blabla +" If you want to disable this feature, add +" let g:EchoFuncPathMappingEnabled = 0 +" to your vimrc. It's enabled by default. +" To add more mappings in g:EchoFuncPathMapping, search +" this script and you will know how to do it. +" +" +" Thanks: edyfox +" minux +" Zhao Cai +" +"================================================== + +if &compatible == 1 + finish +endif + +" Vim version 7.x is needed. +if v:version < 700 + echohl ErrorMsg | echomsg "Echofunc.vim needs vim version >= 7.0!" | echohl None + finish +endif + +" Change cpoptions to make sure line continuation works +let s:cpo_save=&cpo +set cpo&vim + +let s:res=[] +let s:count=1 + +if !exists("g:EchoFuncPathMapping") + " Note: longest match first + let g:EchoFuncPathMapping = [ + \ [expand("$HOME") , '~'], + \ [expand("$VIM") , '$VIM'] + \] +endif + +if !exists("g:EchoFuncPathMappingEnabled") + let g:EchoFuncPathMappingEnabled = 1 +endif + +func! s:EchoFuncPathMapping(path) + if g:EchoFuncPathMappingEnabled != 1 + return a:path + endif + let l:path = a:path + for item in g:EchoFuncPathMapping + "let l:path = substitute(l:path, escape(item[0],'/'), escape(item[1],'/'), 'ge' ) + let l:path = substitute(l:path, '\V'.escape(item[0],'\'), item[1], 'ge' ) + endfor + return l:path +endf + +function! EchoFuncGetStatusLine() + if len(s:res) == 0 + return '' + endif + return '[' . substitute(s:res[s:count-1],'^\s*','','') . ']' +endfunction + +function! s:EchoFuncDisplay() + if len(s:res) == 0 + return + endif + if g:EchoFuncShowOnStatus == 1 + exec "redrawstatus" + return + endif + + set noshowmode + let content=s:res[s:count-1] + let wincols=&columns + let allowedheight=&lines/5 + let statusline=(&laststatus==1 && winnr('$')>1) || (&laststatus==2) + let reqspaces_lastline=(statusline || !&ruler) ? 12 : 29 + let width=len(content) + let height=width/wincols+1 + let cols_lastline=width%wincols + if cols_lastline > wincols-reqspaces_lastline + let height=height+1 + endif + if height > allowedheight + let height=allowedheight + endif + let &cmdheight=height + echohl Type | echo content | echohl None +endfunction + +" add this function to avoid E432 +function! s:CallTagList(str) + let ftags = [] + try + let ftags=taglist(a:str) + catch /^Vim\%((\a\+)\)\=:E/ + " if error occured, reset tagbsearch option and try again. + let bak=&tagbsearch + set notagbsearch + let ftags=taglist(a:str) + let &tagbsearch=bak + endtry + return ftags +endfunction + +function! s:GetFunctions(fun, fn_only) + let s:res=[] + let funpat=escape(a:fun,'[\*~^') + let ftags=s:CallTagList('^'.funpat.'$') + + if (type(ftags)==type(0) || ((type(ftags)==type([])) && ftags==[])) + if &filetype=='cpp' && funpat!~'^\(catch\|if\|for\|while\|switch\)$' + " Namespaces may be omitted + let ftags=s:CallTagList('::'.funpat.'$') + if (type(ftags)==type(0) || ((type(ftags)==type([])) && ftags==[])) + return + endif + endif + endif + let fil_tag=[] + for i in ftags + if !has_key(i,'name') + continue + endif + if has_key(i,'language') + if !has_key(g:EchoFuncLangsDict,&filetype) + continue + endif + if eval('index(g:EchoFuncLangsDict.' . &filetype . ',i.language)') + \== -1 + continue + endif + endif + if has_key(i,'kind') + " p: prototype/procedure; f: function; m: member + if (!a:fn_only || (i.kind=='p' || i.kind=='f') || + \(i.kind == 'm' && has_key(i,'cmd') && + \ match(i.cmd,'(') != -1)) && + \i.name=~funpat + if &filetype!='cpp' || !has_key(i,'class') || + \i.name!~'::' || i.name=~i.class + let fil_tag+=[i] + endif + endif + else + if !a:fn_only && i.name == a:fun + let fil_tag+=[i] + endif + endif + endfor + if fil_tag==[] + return + endif + let s:count=1 + for i in fil_tag + if has_key(i,'kind') && has_key(i,'name') && has_key(i,'signature') + let tmppat=substitute(escape(i.name,'[\*~^'),'^.*::','','') + if &filetype == 'cpp' + let tmppat=substitute(tmppat,'\.*' + endif + let name=substitute(i.cmd[2:-3],tmppat,'','').i.name.i.signature + elseif has_key(i,'kind') + if i.kind == 'd' + let name='macro ' . i.name + elseif i.kind == 'c' + let name='class ' . i.name + elseif i.kind == 's' + let name='struct ' . i.name + elseif i.kind == 'u' + let name='union ' . i.name + elseif (match('fpmvt',i.kind) != -1) && + \(has_key(i,'cmd') && i.cmd[0] == '/') + let tmppat='\(\<'.i.name.'\>.\{-}\)' + if &filetype == 'c' || + \&filetype == 'cpp' || + \&filetype == 'cs' || + \&filetype == 'java' || + \&filetype == 'javascript' + let tmppat=tmppat . ';.*' + elseif &filetype == 'python' && + \(i.kind == 'm' || i.kind == 'f') + let tmppat=tmppat . ':.*' + elseif &filetype == 'tcl' && + \(i.kind == 'm' || i.kind == 'p') + let tmppat=tmppat . '\({\)\?$' + endif + if i.kind == 'm' && &filetype == 'cpp' + let tmppat=substitute(tmppat,'^\(.*::\)','\\(\1\\)\\?','') + endif + if match(i.cmd[2:-3],tmppat) != -1 + let name=substitute(i.cmd[2:-3],tmppat,'\1','') + if i.kind == 't' && name !~ '^\s*typedef\>' + let name='typedef ' . i.name + endif + elseif i.kind == 't' + let name='typedef ' . i.name + elseif i.kind == 'v' + let name='var ' . i.name + else + let name=i.name + endif + if i.kind == 'm' + if has_key(i,'class') + let name=name . ' <-- class ' . i.class + elseif has_key(i,'struct') + let name=name . ' <-- struct ' . i.struct + elseif has_key(i,'union') + let name=name . ' <-- union ' . i.union + endif + endif + else + let name=i.name + endif + else + let name=i.name + endif + let name=substitute(name,'^\s\+','','') + let name=substitute(name,'\s\+$','','') + let name=substitute(name,'\s\+',' ','g') + let file_line=s:EchoFuncPathMapping(i.filename) + if i.cmd > 0 + let file_line=file_line . ':' . i.cmd + endif + let s:res+=[name.' ('.(index(fil_tag,i)+1).'/'.len(fil_tag).') '.file_line] + endfor +endfunction + +function! s:GetFuncName(text) + let name=substitute(a:text,'.\{-}\(\(\k\+::\)*\(\~\?\k*\|'. + \'operator\s\+new\(\[]\)\?\|'. + \'operator\s\+delete\(\[]\)\?\|'. + \'operator\s*[[\]()+\-*/%<>=!~\^&|]\+'. + \'\)\)\s*$','\1','') + if name =~ '\' " tags have exactly one space after 'operator' + let name=substitute(name,'\ ( (=EchoFunc() + inoremap ) =EchoFuncClear()) + exec 'inoremap ' . g:EchoFuncKeyNext . ' =EchoFuncN()' + exec 'inoremap ' . g:EchoFuncKeyPrev . ' =EchoFuncP()' +endfunction + +function! EchoFuncClear() + echo '' + let s:res=[] + return '' +endfunction + +function! EchoFuncStop() + if !exists('b:EchoFuncStarted') + return + endif + iunmap ( + iunmap ) + exec 'iunmap ' . g:EchoFuncKeyNext + exec 'iunmap ' . g:EchoFuncKeyPrev + unlet b:EchoFuncStarted +endfunction + +function! s:RestoreSettings() + if !exists('b:EchoFuncStarted') + return + endif + if s:ShowMode + set showmode + endif + exec "set cmdheight=".s:CmdHeight + echo +endfunction + +function! BalloonDeclaration() + let line=getline(v:beval_lnum) + let pos=v:beval_col - 1 + let endpos=match(line, '\W', pos) + if endpos != -1 && &filetype == 'cpp' + if v:beval_text == 'operator' + if line[endpos :] =~ '^\s*\(new\(\[]\)\?\|delete\(\[]\)\?\|[[\]+\-*/%<>=!~\^&|]\+\|()\)' + let endpos=matchend(line, '^\s*\(new\(\[]\)\?\|delete\(\[]\)\?\|[[\]+\-*/%<>=!~\^&|]\+\|()\)',endpos) + endif + elseif v:beval_text == 'new' || v:beval_text == 'delete' + if line[:endpos+1] =~ 'operator\s\+\(new\|delete\)\[]$' + let endpos=endpos+2 + endif + endif + endif + if (endpos != -1) + let endpos=endpos - 1 + endif + let name=s:GetFuncName(line[0:endpos]) + if name=='' + return '' + endif + call s:GetFunctions(name, 0) + let result = "" + let cnt=0 + for item in s:res + if cnt < g:EchoFuncMaxBalloonDeclarations + let result = result . item . "\n" + endif + let cnt=cnt+1 + endfor + return strpart(result, 0, len(result) - 1) +endfunction + +function! BalloonDeclarationStart() + set ballooneval + set balloonexpr=BalloonDeclaration() +endfunction + +function! BalloonDeclarationStop() + set balloonexpr= + set noballooneval +endfunction + +if !exists('g:EchoFuncLangsDict') + let g:EchoFuncLangsDict={ + \ 'asm':['Asm'], + \ 'aspvbs':['Asp'], + \ 'awk':['Awk'], + \ 'basic':['Basic'], + \ 'c':['C','C++'], + \ 'cpp':['C','C++'], + \ 'cs':['C#'], + \ 'cobol':['Cobol'], + \ 'eiffel':['Eiffel'], + \ 'erlang':['Erlang'], + \ 'fortran':['Fortran'], + \ 'html':['HTML'], + \ 'java':['Java'], + \ 'javascript':['JavaScript'], + \ 'lisp':['Lisp'], + \ 'lua':['Lua'], + \ 'make':['Make'], + \ 'pascal':['Pascal'], + \ 'perl':['Perl'], + \ 'php':['PHP'], + \ 'python':['Python'], + \ 'rexx':['REXX'], + \ 'ruby':['Ruby'], + \ 'scheme':['Scheme'], + \ 'sh':['Sh'], + \ 'zsh':['Sh'], + \ 'sql':['SQL'], + \ 'slang':['SLang'], + \ 'sml':['SML'], + \ 'tcl':['Tcl'], + \ 'vera':['Vera'], + \ 'verilog':['verilog'], + \ 'vim':['Vim'], + \ 'yacc':['YACC']} +endif + +if !exists("g:EchoFuncLangsUsed") + let g:EchoFuncLangsUsed=sort(keys(g:EchoFuncLangsDict)) +endif + +if !exists("g:EchoFuncMaxBalloonDeclarations") + let g:EchoFuncMaxBalloonDeclarations=20 +endif + +if !exists("g:EchoFuncKeyNext") + if has ("mac") + let g:EchoFuncKeyNext='≠' + else + let g:EchoFuncKeyNext='' + endif +endif + +if !exists("g:EchoFuncKeyPrev") + if has ("mac") + let g:EchoFuncKeyPrev='±' + else + let g:EchoFuncKeyPrev='' + endif +endif + +if !exists("g:EchoFuncShowOnStatus") + let g:EchoFuncShowOnStatus = 0 +endif + +if !exists("g:EchoFuncAutoStartBalloonDeclaration") + let g:EchoFuncAutoStartBalloonDeclaration = 1 +endif + +function! s:CheckTagsLanguage(filetype) + return index(g:EchoFuncLangsUsed, a:filetype) != -1 +endfunction + +function! CheckedEchoFuncStart() + if s:CheckTagsLanguage(&filetype) + call EchoFuncStart() + endif +endfunction + +function! CheckedBalloonDeclarationStart() + if s:CheckTagsLanguage(&filetype) && g:EchoFuncAutoStartBalloonDeclaration + call BalloonDeclarationStart() + endif +endfunction + +function! s:EchoFuncInitialize() + augroup EchoFunc + autocmd! + autocmd InsertLeave * call s:RestoreSettings() + autocmd BufRead,BufNewFile * call CheckedEchoFuncStart() + if has('gui_running') + menu &Tools.Echo\ F&unction.Echo\ F&unction\ Start :call EchoFuncStart() + menu &Tools.Echo\ F&unction.Echo\ Function\ Sto&p :call EchoFuncStop() + endif + + if has("balloon_eval") + autocmd BufRead,BufNewFile * call CheckedBalloonDeclarationStart() + if has('gui_running') + menu &Tools.Echo\ Function.&Balloon\ Declaration\ Start :call BalloonDeclarationStart() + menu &Tools.Echo\ Function.Balloon\ Declaration\ &Stop :call BalloonDeclarationStop() + endif + endif + augroup END + + call CheckedEchoFuncStart() + if has("balloon_eval") + call CheckedBalloonDeclarationStart() + endif +endfunction + +augroup EchoFunc + autocmd BufRead,BufNewFile * call s:EchoFuncInitialize() +augroup END + +" Restore cpoptions +let &cpo=s:cpo_save + +" vim: set et sts=4 sw=4: diff --git a/plugin/fencview.vim b/plugin/fencview.vim new file mode 100644 index 00000000..962cbba7 --- /dev/null +++ b/plugin/fencview.vim @@ -0,0 +1,1351 @@ +"================================================== +" File: fencview.vim +" Brief: View a file in different encodings +" Authors: Ming Bai , +" Wu Yongwei +" Last Change: 2012-02-04 19:18:37 +" Version: 4.8 +" Licence: LGPL +" +" +" Usage: +" Commands: +" :FencAutoDetect +" Auto detect the file encoding. +" Built-in detected encodings: +" Unicode: +" UTF-8 +" Chinese Simplified: +" CP936 (GBK, EUC-CN) +" Chinese Traditional: +" CP950 (Big5) +" EUC-TW +" Japanese: +" CP932 (SJIS) +" EUC-JP +" Korean: +" CP949 (EUC-KR) +" :FencView +" Open the encoding list window, +" and to select an encoding, +" enter to reload the file +" Menu: +" Select a file encoding from the +" Tools->Encoding menu just like what you do in +" firefox/IE. +" Options: +" Set these value in vimrc to config this +" plugin. Example: +" let g:fencview_autodetect = 1 +" +" "$FENCVIEW_TELLENC" +" Now FencView allows the use of an external +" program to determine the file encoding. It +" may give you better performance, or better +" accuracy, in some cases. Set the environment +" variable FENCVIEW_TELLENC (or the vimrc +" variable $FENCVIEW_TELLENC) to use this +" feature. It is currently tested against +" tellenc. +" (default: 'tellenc') +" It means if tellenc is executable, it will +" be used by default. If you still want to use +" the detection mechanism of this script, set +" the value to "fencview". +" +" "g:fencview_autodetect" +" Auto detect file encoding when you open a +" file. +" (default: 1) +" +" "g:fencview_auto_patterns" +" Set this variable in your vimrc to decide +" the pattern of file names to enable +" autodetection. +" (default: '*.txt,*.htm{l\=}') +" +" "g:fencview_checklines" +" It checks first and last several lines of +" current file, so don't set the value too +" large. Set to 0 if you want to check every +" line." (default: 10) +" +" Tip: 1 "+iconv" feature is needed. If you are +" using Microsoft Windows, make sure you +" have iconv.dll in $PATH. +" (http://mbbill.googlepages.com/iconv.dll) +" Use command ":echo has('iconv')" to check it. +" 2 Make sure there is no modeline at the end of +" current file. +" 3 set encoding to utf-8 for better performance. +" 4 No effect to Vim encrypted files. +" +" +" +" Thanks: jasonal +" +" +"================================================== +" Vim version 7.x is needed. Thanks to Ingo Karkat +if v:version < 700 + finish +endif + +" Change cpoptions to make sure line continuation works +let s:cpo_save=&cpo +set cpo&vim + +fun! s:escape(name) + " shellescape() was added by patch 7.0.111 + if exists("*shellescape") + return shellescape(a:name) + endif + return "'" . a:name . "'" +endfun + +" variable definition{{{1 +if !exists('g:fencview_autodetect') + let g:fencview_autodetect = 1 +endif +if !exists('g:fencview_auto_patterns') + let g:fencview_auto_patterns='*.txt,*.htm{l\=}' +endif +if !exists('g:fencview_checklines') + let g:fencview_checklines = 10 +endif +if !exists('g:fencview_html_filetypes') + let g:fencview_html_filetypes='html' +endif +if $FENCVIEW_TELLENC == '' + let $FENCVIEW_TELLENC ='tellenc' +endif + + +let s:FencWinName="FencView_8795684" +let s:Fenc8bit=[ + \"latin1 8-bit.characters (ISO 8859-1)", + \"koi8-r Russian", + \"koi8-u Ukrainian", + \"macroman MacRoman (Macintosh encoding)", + \"cp437 similar to iso-8859-1", + \"cp737 similar to iso-8859-7", + \"cp775 Baltic", + \"cp850 similar to iso-8859-4", + \"cp852 similar to iso-8859-1", + \"cp855 similar to iso-8859-2", + \"cp857 similar to iso-8859-5", + \"cp860 similar to iso-8859-9", + \"cp861 similar to iso-8859-1", + \"cp862 similar to iso-8859-1", + \"cp863 similar to iso-8859-8", + \"cp865 similar to iso-8859-1", + \"cp866 similar to iso-8859-5", + \"cp869 similar to iso-8859-7", + \"cp874 Thai", + \"cp1250 Czech, Polish, etc", + \"cp1251 Cyrillic", + \"cp1253 Greek", + \"cp1254 Turkish", + \"cp1255 Hebrew", + \"cp1256 Arabic", + \"cp1257 Baltic", + \"cp1258 Vietnamese"] +let s:Fenc16bit=[ + \"gb18030 Simplified Chinese", + \"cp936 Simplified Chinese (Windows only)", + \"euc-cn Simplified Chinese (Unix only)", + \"cp950 Traditional Chinese (on Unix alias for big5)", + \"big5 Traditional Chinese (on Windows alias for cp950)", + \"euc-tw Traditional Chinese (Unix only)", + \"cp932 Japanese (Windows only)", + \"euc-jp Japanese (Unix only)", + \"sjis Japanese (Unix only)", + \"cp949 Korean (Unix and Windows)", + \"euc-kr Korean (Unix only)"] +let s:FencUnicode=[ + \"utf-8 32 bit UTF-8 encoded Unicode (ISO/IEC 10646-1)", + \"ucs-2 16 bit UCS-2 encoded Unicode (ISO/IEC 10646-1)", + \"ucs-2le like ucs-2, little endian", + \"utf-16 ucs-2 extended with double-words for more characters", + \"utf-16le like utf-16, little endian", + \"ucs-4 32 bit UCS-4 encoded Unicode (ISO/IEC 10646-1)", + \"ucs-4le like ucs-4, little endian"] +let g:FencCustom= + \"Examples:\n". + \"------------------\n". + \"iso-8859-n ISO_8859 variant (n=2 to 15)\n". + \"8bit-{name} any 8-bit encoding (Vim specific name)\n". + \"cp{number} MS-Windows: any installed single-byte codepage\n". + \"cp{number} MS-Windows: any installed double-byte codepage\n". + \"2byte-{name} Unix: any double-byte encoding (Vim specific name)" + +" cp936TopChars"{{{1 +let s:cp936TopChars=[ +\0xb5.0xc4,0xd2.0xbb,0xb9.0xfa,0xd4.0xda,0xc8.0xcb,0xc1.0xcb,0xd3.0xd0,0xd6.0xd0, +\0xca.0xc7,0xc4.0xea,0xba.0xcd,0xb4.0xf3,0xd2.0xb5,0xb2.0xbb,0xce.0xaa,0xb7.0xa2, +\0xbb.0xe1,0xb9.0xa4,0xbe.0xad,0xc9.0xcf,0xb5.0xd8,0xca.0xd0,0xd2.0xaa,0xb8.0xf6, +\0xb2.0xfa,0xd5.0xe2,0xb3.0xf6,0xd0.0xd0,0xd7.0xf7,0xc9.0xfa,0xbc.0xd2,0xd2.0xd4, +\0xb3.0xc9,0xb5.0xbd,0xc8.0xd5,0xc3.0xf1,0xc0.0xb4,0xce.0xd2,0xb2.0xbf,0xb6.0xd4, +\0xbd.0xf8,0xb6.0xe0,0xc8.0xab,0xbd.0xa8,0xcb.0xfb,0xb9.0xab,0xbf.0xaa,0xc3.0xc7, +\0xb3.0xa1,0xd5.0xb9,0xca.0xb1,0xc0.0xed,0xd0.0xc2,0xb7.0xbd,0xd6.0xf7,0xc6.0xf3, +\0xd7.0xca,0xca.0xb5,0xd1.0xa7,0xb1.0xa8,0xd6.0xc6,0xd5.0xfe,0xbc.0xc3,0xd3.0xc3, +\0xcd.0xac,0xd3.0xda,0xb7.0xa8,0xb8.0xdf,0xb3.0xa4,0xcf.0xd6,0xb1.0xbe,0xd4.0xc2, +\0xb6.0xa8,0xbb.0xaf,0xbc.0xd3,0xb6.0xaf,0xba.0xcf,0xc6.0xb7,0xd6.0xd8,0xb9.0xd8, +\0xbb.0xfa,0xb7.0xd6,0xc1.0xa6,0xd7.0xd4,0xcd.0xe2,0xd5.0xdf,0xc7.0xf8,0xc4.0xdc, +\0xc9.0xe8,0xba.0xf3,0xbe.0xcd,0xb5.0xc8,0xcc.0xe5,0xcf.0xc2,0xcd.0xf2,0xd4.0xaa, +\0xc9.0xe7,0xb9.0xfd,0xc7.0xb0,0xc3.0xe6,0xc5.0xa9,0xd2.0xb2,0xb5.0xc3,0xd3.0xeb, +\0xcb.0xb5,0xd6.0xae,0xd4.0xb1,0xb6.0xf8,0xce.0xf1,0xc0.0xfb,0xb5.0xe7,0xce.0xc4, +\0xca.0xc2,0xbf.0xc9,0xd6.0xd6,0xd7.0xdc,0xb8.0xc4,0xc8.0xfd,0xb8.0xf7,0xba.0xc3, +\0xbd.0xf0,0xb5.0xda,0xcb.0xbe,0xc6.0xe4,0xb4.0xd3,0xc6.0xbd,0xb4.0xfa,0xb5.0xb1, +\0xcc.0xec,0xcb.0xae,0xca.0xa1,0xcc.0xe1,0xc9.0xcc,0xca.0xae,0xb9.0xdc,0xc4.0xda, +\0xd0.0xa1,0xbc.0xbc,0xce.0xbb,0xc4.0xbf,0xc6.0xf0,0xba.0xa3,0xcb.0xf9,0xc1.0xa2, +\0xd2.0xd1,0xcd.0xa8,0xc8.0xeb,0xc1.0xbf,0xd7.0xd3,0xce.0xca,0xb6.0xc8,0xb1.0xb1, +\0xb1.0xa3,0xd0.0xc4,0xbb.0xb9,0xbf.0xc6,0xce.0xaf,0xb6.0xbc,0xca.0xf5,0xca.0xb9, +\0xc3.0xf7,0xd7.0xc5,0xb4.0xce,0xbd.0xab,0xd4.0xf6,0xbb.0xf9,0xc3.0xfb,0xcf.0xf2, +\0xc3.0xc5,0xd3.0xa6,0xc0.0xef,0xc3.0xc0,0xd3.0xc9,0xb9.0xe6,0xbd.0xf1,0xcc.0xe2, +\0xbc.0xc7,0xb5.0xe3,0xbc.0xc6,0xc8.0xa5,0xc7.0xbf,0xc1.0xbd,0xd0.0xa9,0xb1.0xed, +\0xcf.0xb5,0xb0.0xec,0xbd.0xcc,0xd5.0xfd,0xcc.0xf5,0xd7.0xee,0xb4.0xef,0xcc.0xd8, +\0xb8.0xef,0xca.0xd5,0xb6.0xfe,0xc6.0xda,0xb2.0xa2,0xb3.0xcc,0xb3.0xa7,0xc8.0xe7, +\0xb5.0xc0,0xbc.0xca,0xbc.0xb0,0xce.0xf7,0xbf.0xda,0xbe.0xa9,0xbb.0xaa,0xc8.0xce, +\0xb5.0xf7,0xd0.0xd4,0xb5.0xbc,0xd7.0xe9,0xb6.0xab,0xc2.0xb7,0xbb.0xee,0xb9.0xe3, +\0xd2.0xe2,0xb1.0xc8,0xcd.0xb6,0xbe.0xf6,0xbd.0xbb,0xcd.0xb3,0xb5.0xb3,0xc4.0xcf, +\0xb0.0xb2,0xb4.0xcb,0xc1.0xec,0xbd.0xe1,0xd3.0xaa,0xcf.0xee,0xc7.0xe9,0xbd.0xe2, +\0xd2.0xe9,0xd2.0xe5,0xc9.0xbd,0xcf.0xc8,0xb3.0xb5,0xc8.0xbb,0xbc.0xdb,0xb7.0xc5, +\0xca.0xc0,0xbc.0xe4,0xd2.0xf2,0xb9.0xb2,0xd4.0xba,0xb2.0xbd,0xce.0xef,0xbd.0xe7, +\0xbc.0xaf,0xb0.0xd1,0xb3.0xd6,0xce.0xde,0xb5.0xab,0xb3.0xc7,0xcf.0xe0,0xca.0xe9, +\0xb4.0xe5,0xc7.0xf3,0xd6.0xce,0xc8.0xa1,0xd4.0xad,0xb4.0xa6,0xb8.0xae,0xd1.0xd0, +\0xd6.0xca,0xd0.0xc5,0xcb.0xc4,0xd4.0xcb,0xcf.0xd8,0xbe.0xfc,0xbc.0xfe,0xd3.0xfd, +\0xbe.0xd6,0xb8.0xc9,0xb6.0xd3,0xcd.0xc5,0xd3.0xd6,0xd4.0xec,0xd0.0xce,0xbc.0xb6, +\0xb1.0xea,0xc1.0xaa,0xd7.0xa8,0xc9.0xd9,0xb7.0xd1,0xd0.0xa7,0xbe.0xdd,0xca.0xd6, +\0xca.0xa9,0xc8.0xa8,0xbd.0xad,0xbd.0xfc,0xc9.0xee,0xb8.0xfc,0xc8.0xcf,0xb9.0xfb, +\0xb8.0xf1,0xbc.0xb8,0xbf.0xb4,0xc3.0xbb,0xd6.0xb0,0xb7.0xfe,0xcc.0xa8,0xca.0xbd, +\0xd2.0xe6,0xcf.0xeb,0xca.0xfd,0xb5.0xa5,0xd1.0xf9,0xd6.0xbb,0xb1.0xbb,0xd2.0xda, +\0xc0.0xcf,0xca.0xdc,0xd3.0xc5,0xb3.0xa3,0xcf.0xfa,0xd6.0xbe,0xd5.0xbd,0xc1.0xf7, +\0xba.0xdc,0xbd.0xd3,0xcf.0xe7,0xcd.0xb7,0xb8.0xf8,0xd6.0xc1,0xc4.0xd1,0xb9.0xdb, +\0xd6.0xb8,0xb4.0xb4,0xd6.0xa4,0xd6.0xaf,0xc2.0xdb,0xb1.0xf0,0xce.0xe5,0xd0.0xad, +\0xb1.0xe4,0xb7.0xe7,0xc5.0xfa,0xbc.0xfb,0xbe.0xbf,0xd6.0xa7,0xc4.0xc7,0xb2.0xe9, +\0xd5.0xc5,0xbe.0xab,0xc3.0xbf,0xc1.0xd6,0xd7.0xaa,0xbb.0xae,0xd7.0xbc,0xd7.0xf6, +\0xd0.0xe8,0xb4.0xab,0xd5.0xf9,0xcb.0xb0,0xb9.0xb9,0xbe.0xdf,0xb0.0xd9,0xbb.0xf2, +\0xb2.0xc5,0xbb.0xfd,0xca.0xc6,0xbe.0xd9,0xb1.0xd8,0xd0.0xcd,0xd2.0xd7,0xca.0xd3, +\0xbf.0xec,0xc0.0xee,0xb2.0xce,0xbb.0xd8,0xd2.0xfd,0xd5.0xf2,0xca.0xd7,0xcd.0xc6, +\0xcb.0xbc,0xcd.0xea,0xcf.0xfb,0xd6.0xb5,0xb8.0xc3,0xd7.0xdf,0xd7.0xb0,0xd6.0xda, +\0xd4.0xf0,0xb1.0xb8,0xd6.0xdd,0xb9.0xa9,0xb0.0xfc,0xb8.0xb1,0xbc.0xab,0xd5.0xfb, +\0xc8.0xb7,0xd6.0xaa,0xc3.0xb3,0xbc.0xba,0xbb.0xb7,0xbb.0xb0,0xb7.0xb4,0xc9.0xed, +\0xd1.0xa1,0xd1.0xc7,0xc3.0xb4,0xb4.0xf8,0xb2.0xc9,0xcd.0xf5,0xb2.0xdf,0xd5.0xe6, +\0xc5.0xae,0xcc.0xb8,0xd1.0xcf,0xcb.0xb9,0xbf.0xf6,0xc9.0xab,0xb4.0xf2,0xb5.0xc2, +\0xb8.0xe6,0xbd.0xf6,0xcb.0xfc,0xc6.0xf8,0xc1.0xcf,0xc9.0xf1,0xc2.0xca,0xca.0xb6, +\0xc0.0xcd,0xbe.0xb3,0xd4.0xb4,0xc7.0xe0,0xbb.0xa4,0xc1.0xd0,0xd0.0xcb,0xd0.0xed, +\0xbb.0xa7,0xc2.0xed,0xb8.0xdb,0xd4.0xf2,0xbd.0xda,0xbf.0xee,0xc0.0xad,0xd6.0xb1, +\0xb0.0xb8,0xb9.0xc9,0xb9.0xe2,0xbd.0xcf,0xba.0xd3,0xbb.0xa8,0xb8.0xf9,0xb2.0xbc, +\0xcf.0xdf,0xcd.0xc1,0xbf.0xcb,0xd4.0xd9,0xc8.0xba,0xd2.0xbd,0xc7.0xe5,0xcb.0xd9, +\0xc2.0xc9,0xcb.0xfd,0xd7.0xe5,0xc0.0xfa,0xb7.0xc7,0xb8.0xd0,0xd5.0xbc,0xd0.0xf8, +\0xca.0xa6,0xba.0xce,0xd3.0xb0,0xb9.0xa6,0xb8.0xba,0xd1.0xe9,0xcd.0xfb,0xb2.0xc6, +\0xc0.0xe0,0xbb.0xf5,0xd4.0xbc,0xd2.0xd5,0xca.0xdb,0xc1.0xac,0xbc.0xcd,0xb0.0xb4, +\0xd1.0xb6,0xca.0xb7,0xca.0xbe,0xcf.0xf3,0xd1.0xf8,0xbb.0xf1,0xca.0xaf,0xca.0xb3, +\0xd7.0xa5,0xb8.0xbb,0xc4.0xa3,0xca.0xbc,0xd7.0xa1,0xc8.0xfc,0xbf.0xcd,0xd4.0xbd, +\0xce.0xc5,0xd1.0xeb,0xcf.0xaf,0xbc.0xe1] + +" cp950TopChars"{{{1 +let s:cp950TopChars=[ +\0xaa.0xba,0xa4.0x40,0xb0.0xea,0xa6.0x62,0xa4.0x48,0xa4.0x46,0xa6.0xb3,0xa4.0xa4, +\0xac.0x4f,0xa6.0x7e,0xa9.0x4d,0xa4.0x6a,0xb7.0x7e,0xa4.0xa3,0xac.0xb0,0xb5.0x6f, +\0xb7.0x7c,0xa4.0x75,0xb8.0x67,0xa4.0x57,0xa6.0x61,0xa5.0xab,0xad.0x6e,0xad.0xd3, +\0xb2.0xa3,0xb3.0x6f,0xa5.0x58,0xa6.0xe6,0xa7.0x40,0xa5.0xcd,0xae.0x61,0xa5.0x48, +\0xa6.0xa8,0xa8.0xec,0xa4.0xe9,0xa5.0xc1,0xa8.0xd3,0xa7.0xda,0xb3.0xa1,0xb9.0xef, +\0xb6.0x69,0xa6.0x68,0xa5.0xfe,0xab.0xd8,0xa5.0x4c,0xa4.0xbd,0xb6.0x7d,0xad.0xcc, +\0xb3.0xf5,0xae.0x69,0xae.0xc9,0xb2.0x7a,0xb7.0x73,0xa4.0xe8,0xa5.0x44,0xa5.0xf8, +\0xb8.0xea,0xb9.0xea,0xbe.0xc7,0xb3.0xf8,0xa8.0xee,0xac.0x46,0xc0.0xd9,0xa5.0xce, +\0xa6.0x50,0xa4.0x5f,0xaa.0x6b,0xb0.0xaa,0xaa.0xf8,0xb2.0x7b,0xa5.0xbb,0xa4.0xeb, +\0xa9.0x77,0xa4.0xc6,0xa5.0x5b,0xb0.0xca,0xa6.0x58,0xab.0x7e,0xad.0xab,0xc3.0xf6, +\0xbe.0xf7,0xa4.0xc0,0xa4.0x4f,0xa6.0xdb,0xa5.0x7e,0xaa.0xcc,0xb0.0xcf,0xaf.0xe0, +\0xb3.0x5d,0xab.0xe1,0xb4.0x4e,0xb5.0xa5,0xc5.0xe9,0xa4.0x55,0xb8.0x55,0xa4.0xb8, +\0xaa.0xc0,0xb9.0x4c,0xab.0x65,0xad.0xb1,0xb9.0x41,0xa4.0x5d,0xb1.0x6f,0xbb.0x50, +\0xbb.0xa1,0xa4.0xa7,0xad.0xfb,0xa6.0xd3,0xb0.0xc8,0xa7.0x51,0xb9.0x71,0xa4.0xe5, +\0xa8.0xc6,0xa5.0x69,0xba.0xd8,0xc1.0x60,0xa7.0xef,0xa4.0x54,0xa6.0x55,0xa6.0x6e, +\0xaa.0xf7,0xb2.0xc4,0xa5.0x71,0xa8.0xe4,0xb1.0x71,0xa5.0xad,0xa5.0x4e,0xb7.0xed, +\0xa4.0xd1,0xa4.0xf4,0xac.0xd9,0xb4.0xa3,0xb0.0xd3,0xa4.0x51,0xba.0xde,0xa4.0xba, +\0xa4.0x70,0xa7.0xde,0xa6.0xec,0xa5.0xd8,0xb0.0x5f,0xae.0xfc,0xa9.0xd2,0xa5.0xdf, +\0xa4.0x77,0xb3.0x71,0xa4.0x4a,0xb6.0x71,0xa4.0x6c,0xb0.0xdd,0xab.0xd7,0xa5.0x5f, +\0xab.0x4f,0xa4.0xdf,0xc1.0xd9,0xac.0xec,0xa9.0x65,0xb3.0xa3,0xb3.0x4e,0xa8.0xcf, +\0xa9.0xfa,0xb5.0xdb,0xa6.0xb8,0xb1.0x4e,0xbc.0x57,0xb0.0xf2,0xa6.0x57,0xa6.0x56, +\0xaa.0xf9,0xc0.0xb3,0xb8.0xcc,0xac.0xfc,0xa5.0xd1,0xb3.0x57,0xa4.0xb5,0xc3.0x44, +\0xb0.0x4f,0xc2.0x49,0xad.0x70,0xa5.0x68,0xb1.0x6a,0xa8.0xe2,0xa8.0xc7,0xaa.0xed, +\0xa8.0x74,0xbf.0xec,0xb1.0xd0,0xa5.0xbf,0xb1.0xf8,0xb3.0xcc,0xb9.0x46,0xaf.0x53, +\0xad.0xb2,0xa6.0xac,0xa4.0x47,0xb4.0xc1,0xa8.0xc3,0xb5.0x7b,0xbc.0x74,0xa6.0x70, +\0xb9.0x44,0xbb.0xda,0xa4.0xce,0xa6.0xe8,0xa4.0x66,0xa8.0xca,0xb5.0xd8,0xa5.0xf4, +\0xbd.0xd5,0xa9.0xca,0xbe.0xc9,0xb2.0xd5,0xaa.0x46,0xb8.0xf4,0xac.0xa1,0xbc.0x73, +\0xb7.0x4e,0xa4.0xf1,0xa7.0xeb,0xa8.0x4d,0xa5.0xe6,0xb2.0xce,0xc4.0xd2,0xab.0x6e, +\0xa6.0x77,0xa6.0xb9,0xbb.0xe2,0xb5.0xb2,0xc0.0xe7,0xb6.0xb5,0xb1.0xa1,0xb8.0xd1, +\0xc4.0xb3,0xb8.0x71,0xa4.0x73,0xa5.0xfd,0xa8.0xae,0xb5.0x4d,0xbb.0xf9,0xa9.0xf1, +\0xa5.0x40,0xb6.0xa1,0xa6.0x5d,0xa6.0x40,0xb0.0x7c,0xa8.0x42,0xaa.0xab,0xac.0xc9, +\0xb6.0xb0,0xa7.0xe2,0xab.0xf9,0xb5.0x4c,0xa6.0xfd,0xab.0xb0,0xac.0xdb,0xae.0xd1, +\0xa7.0xf8,0xa8.0x44,0xaa.0x76,0xa8.0xfa,0xad.0xec,0xb3.0x42,0xa9.0xb2,0xac.0xe3, +\0xbd.0xe8,0xab.0x48,0xa5.0x7c,0xb9.0x42,0xbf.0xa4,0xad.0x78,0xa5.0xf3,0xa8.0x7c, +\0xa7.0xbd,0xb7.0x46,0xb6.0xa4,0xb9.0xce,0xa4.0x53,0xb3.0x79,0xa7.0xce,0xaf.0xc5, +\0xbc.0xd0,0xc1.0x70,0xb1.0x4d,0xa4.0xd6,0xb6.0x4f,0xae.0xc4,0xbe.0xda,0xa4.0xe2, +\0xac.0x49,0xc5.0x76,0xa6.0xbf,0xaa.0xf1,0xb2.0x60,0xa7.0xf3,0xbb.0x7b,0xaa.0x47, +\0xae.0xe6,0xb4.0x58,0xac.0xdd,0xa8.0x53,0xc2.0xbe,0xaa.0x41,0xa5.0x78,0xa6.0xa1, +\0xaf.0x71,0xb7.0x51,0xbc.0xc6,0xb3.0xe6,0xbc.0xcb,0xa5.0x75,0xb3.0x51,0xbb.0xf5, +\0xa6.0xd1,0xa8.0xfc,0xc0.0x75,0xb1.0x60,0xbe.0x50,0xa7.0xd3,0xbe.0xd4,0xac.0x79, +\0xab.0xdc,0xb1.0xb5,0xb6.0x6d,0xc0.0x59,0xb5.0xb9,0xa6.0xdc,0xc3.0xf8,0xc6.0x5b, +\0xab.0xfc,0xb3.0xd0,0xb5.0xfd,0xc2.0xb4,0xbd.0xd7,0xa7.0x4f,0xa4.0xad,0xa8.0xf3, +\0xc5.0xdc,0xad.0xb7,0xa7.0xe5,0xa8.0xa3,0xa8.0x73,0xa4.0xe4,0xa8.0xba,0xac.0x64, +\0xb1.0x69,0xba.0xeb,0xa8.0x43,0xaa.0x4c,0xc2.0xe0,0xb9.0xba,0xb7.0xc7,0xb0.0xb5, +\0xbb.0xdd,0xb6.0xc7,0xaa.0xa7,0xb5.0x7c,0xba.0x63,0xa8.0xe3,0xa6.0xca,0xa9.0xce, +\0xa4.0x7e,0xbf.0x6e,0xb6.0xd5,0xc1.0x7c,0xa5.0xb2,0xab.0xac,0xa9.0xf6,0xb5.0xf8, +\0xa7.0xd6,0xa7.0xf5,0xb0.0xd1,0xa6.0x5e,0xa4.0xde,0xc2.0xed,0xad.0xba,0xb1.0xc0, +\0xab.0xe4,0xa7.0xb9,0xae.0xf8,0xad.0xc8,0xb8.0xd3,0xa8.0xab,0xb8.0xcb,0xb2.0xb3, +\0xb3.0x64,0xb3.0xc6,0xa6.0x7b,0xa8.0xd1,0xa5.0x5d,0xb0.0xc6,0xb7.0xa5,0xbe.0xe3, +\0xbd.0x54,0xaa.0xbe,0xb6.0x54,0xa4.0x76,0xc0.0xf4,0xb8.0xdc,0xa4.0xcf,0xa8.0xad, +\0xbf.0xef,0xa8.0xc8,0xbb.0xf2,0xb1.0x61,0xb1.0xc4,0xa4.0xfd,0xb5.0xa6,0xaf.0x75, +\0xa4.0x6b,0xbd.0xcd,0xc4.0x59,0xb4.0xb5,0xaa.0x70,0xa6.0xe2,0xa5.0xb4,0xbc.0x77, +\0xa7.0x69,0xb6.0xc8,0xa5.0xa6,0xae.0xf0,0xae.0xc6,0xaf.0xab,0xb2.0x76,0xc3.0xd1, +\0xb3.0xd2,0xb9.0xd2,0xb7.0xbd,0xab.0x43,0xc5.0x40,0xa6.0x43,0xbf.0xb3,0xb3.0x5c, +\0xa4.0xe1,0xb0.0xa8,0xb4.0xe4,0xab.0x68,0xb8.0x60,0xb4.0xda,0xa9.0xd4,0xaa.0xbd, +\0xae.0xd7,0xaa.0xd1,0xa5.0xfa,0xb8.0xfb,0xaa.0x65,0xaa.0xe1,0xae.0xda,0xa5.0xac, +\0xbd.0x75,0xa4.0x67,0xa7.0x4a,0xa6.0x41,0xb8.0x73,0xc2.0xe5,0xb2.0x4d,0xb3.0x74, +\0xab.0xdf,0xa6.0x6f,0xb1.0xda,0xbe.0xfa,0xab.0x44,0xb7.0x50,0xa6.0xfb,0xc4.0xf2, +\0xae.0x76,0xa6.0xf3,0xbc.0x76,0xa5.0x5c,0xad.0x74,0xc5.0xe7,0xb1.0xe6,0xb0.0x5d, +\0xc3.0xfe,0xb3.0x66,0xac.0xf9,0xc3.0xc0,0xb0.0xe2,0xb3.0x73,0xac.0xf6,0xab.0xf6, +\0xb0.0x54,0xa5.0x76,0xa5.0xdc,0xb6.0x48,0xbe.0x69,0xc0.0xf2,0xa5.0xdb,0xad.0xb9, +\0xa7.0xec,0xb4.0x49,0xbc.0xd2,0xa9.0x6c,0xa6.0xed,0xc1.0xc9,0xab.0xc8,0xb6.0x56, +\0xbb.0x44,0xa5.0xa1,0xae.0x75,0xb0.0xed] + +" euc_twTopChars"{{{1 +let s:euc_twTopChars=[ +\0xce.0xfb,0xc4.0xa1,0xd9.0xcf,0xc7.0xe3,0xc4.0xa9,0xc4.0xa7,0xc8.0xb4,0xc4.0xe3, +\0xd1.0xd2,0xc8.0xa1,0xcc.0xcf,0xc4.0xcb,0xe4.0xc6,0xc4.0xe2,0xd2.0xb3,0xe0.0xf5, +\0xe4.0xc4,0xc4.0xd6,0xe5.0xee,0xc4.0xb8,0xc7.0xe2,0xc6.0xcb,0xd3.0xd1,0xd4.0xb6, +\0xdc.0xa8,0xdd.0xd5,0xc5.0xf8,0xc8.0xe7,0xc9.0xa2,0xc6.0xed,0xd5.0xa5,0xc5.0xe8, +\0xc8.0xa9,0xcc.0xaf,0xc5.0xca,0xc6.0xe1,0xcb.0xf4,0xca.0xbc,0xdd.0xe5,0xe8.0xd7, +\0xe2.0xd0,0xc7.0xe9,0xc7.0xc0,0xd0.0xfa,0xc5.0xec,0xc4.0xfc,0xe2.0xe4,0xd4.0xaf, +\0xde.0xdb,0xd5.0xad,0xd5.0xeb,0xdc.0xa1,0xe4.0xbb,0xc5.0xc9,0xc5.0xe4,0xc7.0xba, +\0xe6.0xf1,0xe8.0xd2,0xf0.0xd0,0xde.0xde,0xcc.0xb1,0xd1.0xc9,0xf4.0xa4,0xc6.0xee, +\0xc7.0xd1,0xc4.0xc0,0xce.0xce,0xd8.0xed,0xcf.0xdb,0xdc.0xa2,0xc6.0xdb,0xc5.0xcc, +\0xcc.0xf9,0xc5.0xa7,0xc5.0xfb,0xd9.0xaf,0xc7.0xd9,0xd0.0xc2,0xd3.0xec,0xf9.0xc3, +\0xf1.0xa2,0xc5.0xa1,0xc4.0xb0,0xc8.0xdc,0xc6.0xc0,0xcf.0xaf,0xd9.0xb4,0xd7.0xe4, +\0xdd.0xc3,0xd1.0xa5,0xde.0xf3,0xe1.0xab,0xfc.0xd5,0xc4.0xb6,0xe5.0xdc,0xc4.0xf7, +\0xcf.0xa3,0xe7.0xb4,0xd0.0xa9,0xd3.0xf2,0xe7.0xa9,0xc4.0xbe,0xda.0xb5,0xea.0xd8, +\0xeb.0xa9,0xc4.0xe6,0xd4.0xde,0xc8.0xd4,0xd9.0xad,0xc9.0xb3,0xe7.0xd9,0xc5.0xc6, +\0xcb.0xe7,0xc6.0xab,0xea.0xa1,0xf4.0xea,0xca.0xd1,0xc4.0xb5,0xc7.0xd6,0xc7.0xef, +\0xcf.0xda,0xdc.0xc9,0xc6.0xb3,0xcc.0xa7,0xda.0xb7,0xc6.0xcd,0xc5.0xee,0xe5.0xb5, +\0xc5.0xb2,0xc5.0xd5,0xd2.0xdc,0xdf.0xc8,0xd9.0xb8,0xc4.0xb2,0xea.0xa7,0xc4.0xf9, +\0xc4.0xd1,0xca.0xc0,0xc8.0xed,0xc6.0xf8,0xd8.0xc4,0xd6.0xc0,0xcd.0xd4,0xc7.0xa1, +\0xc4.0xd8,0xdd.0xd7,0xc4.0xab,0xe2.0xd8,0xc4.0xcd,0xd9.0xc2,0xd0.0xf9,0xc6.0xa1, +\0xcf.0xf1,0xc5.0xc0,0xf5.0xe4,0xd2.0xef,0xcc.0xe7,0xdd.0xe7,0xdd.0xb4,0xcb.0xf0, +\0xcd.0xfc,0xe1.0xe1,0xc8.0xb9,0xd9.0xf2,0xec.0xc1,0xd9.0xd7,0xc7.0xd8,0xc7.0xd7, +\0xcf.0xdc,0xf3.0xdc,0xe6.0xd3,0xd3.0xa1,0xc6.0xf1,0xdd.0xbd,0xc4.0xf4,0xf7.0xee, +\0xd8.0xb4,0xf6.0xb5,0xd3.0xd3,0xc6.0xaa,0xda.0xb0,0xcc.0xa5,0xcb.0xe8,0xcf.0xd0, +\0xcb.0xb7,0xf2.0xd6,0xda.0xf4,0xc6.0xdf,0xdb.0xbe,0xde.0xb2,0xe7.0xae,0xd6.0xd6, +\0xd3.0xf3,0xc8.0xad,0xc4.0xa8,0xdf.0xe6,0xcb.0xe4,0xe1.0xa3,0xec.0xde,0xc7.0xf1, +\0xe7.0xac,0xeb.0xe3,0xc5.0xaf,0xc8.0xe9,0xc4.0xc7,0xcb.0xeb,0xe1.0xde,0xc7.0xb6, +\0xee.0xfe,0xcd.0xcc,0xf0.0xd2,0xdc.0xda,0xce.0xa9,0xe6.0xfb,0xd2.0xa4,0xec.0xdd, +\0xe3.0xf4,0xc5.0xd2,0xca.0xcd,0xca.0xee,0xc7.0xa8,0xdc.0xd3,0xfa.0xdd,0xd0.0xb2, +\0xc7.0xf8,0xc8.0xba,0xeb.0xeb,0xe1.0xb8,0xf4.0xb2,0xe2.0xfa,0xda.0xc5,0xe6.0xd8, +\0xfa.0xbe,0xe5.0xf8,0xc4.0xd4,0xc7.0xbf,0xcb.0xcf,0xe0.0xd3,0xec.0xa4,0xcd.0xf3, +\0xc5.0xe0,0xe2.0xe6,0xc7.0xde,0xc7.0xc1,0xd8.0xe1,0xca.0xe3,0xce.0xec,0xd2.0xcc, +\0xe2.0xf5,0xca.0xc4,0xd1.0xbd,0xe0.0xd2,0xc8.0xfe,0xd0.0xd2,0xd2.0xde,0xd5.0xf3, +\0xca.0xda,0xca.0xe5,0xce.0xd9,0xcc.0xbd,0xd4.0xcf,0xdd.0xa8,0xcd.0xb4,0xd2.0xe6, +\0xef.0xb3,0xcf.0xea,0xc6.0xbe,0xe7.0xaa,0xf1.0xec,0xd3.0xdb,0xc7.0xb5,0xcb.0xbf, +\0xc9.0xfd,0xe3.0xec,0xe2.0xe9,0xe8.0xb6,0xc4.0xb4,0xdd.0xdf,0xca.0xb0,0xd7.0xc8, +\0xed.0xba,0xf4.0xfa,0xd9.0xf1,0xc5.0xb7,0xe2.0xb6,0xd5.0xe6,0xf0.0xe3,0xc5.0xc3, +\0xd1.0xcc,0xfb.0xe2,0xc8.0xc0,0xcf.0xd4,0xdb.0xe5,0xca.0xd5,0xeb.0xa5,0xce.0xaa, +\0xd6.0xaa,0xde.0xfd,0xd2.0xe0,0xca.0xf4,0xf7.0xaa,0xce.0xa4,0xc6.0xba,0xc8.0xa2, +\0xd6.0xf4,0xe3.0xf7,0xed.0xb0,0xde.0xcc,0xed.0xb5,0xc6.0xb7,0xdd.0xb7,0xeb.0xfe, +\0xc8.0xd2,0xcc.0xbf,0xf3.0xc0,0xda.0xa6,0xef.0xda,0xca.0xb5,0xf0.0xdd,0xd1.0xfc, +\0xd0.0xfe,0xda.0xd9,0xe2.0xd4,0xf3.0xa4,0xe1.0xbf,0xc8.0xdd,0xf9.0xc5,0xfd.0xa8, +\0xd1.0xc0,0xde.0xb6,0xe2.0xa5,0xf6.0xfe,0xef.0xa2,0xc9.0xb1,0xc4.0xec,0xcc.0xb6, +\0xfc.0xc8,0xd3.0xf8,0xca.0xc7,0xcb.0xc4,0xcb.0xb6,0xc5.0xc5,0xcb.0xdb,0xd1.0xe7, +\0xda.0xaf,0xea.0xb4,0xca.0xe4,0xce.0xaf,0xf7.0xcb,0xe8.0xa2,0xe4.0xed,0xd8.0xf8, +\0xeb.0xe6,0xe3.0xae,0xce.0xe8,0xe1.0xa4,0xe9.0xac,0xcc.0xa6,0xc8.0xcb,0xcd.0xd0, +\0xc4.0xdf,0xf1.0xd8,0xe3.0xbc,0xf5.0xa8,0xc6.0xd2,0xd0.0xce,0xcd.0xf8,0xe1.0xfe, +\0xca.0xb8,0xca.0xd7,0xd9.0xb6,0xc7.0xdf,0xc5.0xbf,0xf7.0xd8,0xd3.0xfb,0xda.0xe4, +\0xd1.0xa8,0xc9.0xf9,0xd6.0xbc,0xd4.0xab,0xe6.0xda,0xcb.0xcc,0xe6.0xd2,0xdc.0xb8, +\0xdd.0xca,0xde.0xac,0xc7.0xfc,0xcb.0xf2,0xc5.0xfd,0xd9.0xab,0xe4.0xcb,0xf0.0xec, +\0xed.0xfd,0xcf.0xa1,0xe2.0xbb,0xc4.0xd7,0xf4.0xbf,0xe6.0xe3,0xc5.0xb0,0xcb.0xce, +\0xf2.0xd9,0xcb.0xe9,0xeb.0xfb,0xda.0xa7,0xda.0xe8,0xc5.0xde,0xe1.0xac,0xd6.0xf8, +\0xc4.0xcc,0xee.0xf6,0xf9.0xe4,0xdf.0xda,0xce.0xd3,0xc8.0xe3,0xc6.0xd4,0xec.0xe1, +\0xc9.0xcb,0xe3.0xaf,0xc6.0xc6,0xd6.0xb4,0xd5.0xe8,0xd7.0xae,0xdb.0xfb,0xf8.0xfc, +\0xde.0xb8,0xe8.0xba,0xe4.0xe3,0xcf.0xe5,0xfb.0xac,0xc7.0xc4,0xf1.0xfb,0xdd.0xc2, +\0xc5.0xc2,0xd8.0xeb,0xe0.0xab,0xd0.0xac,0xe5.0xe7,0xe0.0xa1,0xcd.0xd6,0xce.0xfe, +\0xd5.0xf9,0xcf.0xb4,0xc7.0xbc,0xe7.0xa4,0xce.0xc8,0xcf.0xc4,0xd5.0xfc,0xc6.0xcc, +\0xee.0xc0,0xc4.0xc8,0xc9.0xac,0xc7.0xc2,0xe5.0xfa,0xf7.0xd0,0xdb.0xd2,0xdd.0xda, +\0xd1.0xa3,0xc7.0xf0,0xda.0xfe,0xf1.0xa5,0xcf.0xe6,0xe3.0xf6,0xc8.0xfc,0xfa.0xfd, +\0xd5.0xba,0xc8.0xf4,0xec.0xe0,0xc5.0xfc,0xd3.0xd7,0xfc.0xd3,0xdb.0xac,0xd8.0xc2, +\0xf9.0xcb,0xdd.0xcc,0xd2.0xfc,0xf8.0xeb,0xd9.0xc7,0xdd.0xd9,0xd2.0xf9,0xd1.0xba, +\0xd8.0xb9,0xc6.0xb8,0xc6.0xfc,0xe2.0xaf,0xef.0xf2,0xf4.0xbd,0xc6.0xfb,0xd3.0xfa, +\0xca.0xce,0xde.0xee,0xed.0xbc,0xcc.0xee,0xc8.0xee,0xf5.0xd4,0xd0.0xea,0xe2.0xbd, +\0xea.0xcc,0xc6.0xc1,0xd5.0xb9,0xd9.0xd2] + +" cp932TopChars"{{{1 +let s:cp932TopChars=[ +\0x82.0xb5,0x82.0xf0,0x82.0xcc,0x82.0xb7,0x82.0xdc,0x82.0xc9,0x82.0xe9,0x81.0x5b, +\0x82.0xc6,0x82.0xcd,0x83.0x93,0x83.0x8b,0x83.0x43,0x83.0x76,0x82.0xc5,0x82.0xa4, +\0x82.0xc4,0x83.0x5e,0x83.0x58,0x82.0xa2,0x8d.0x73,0x82.0xe5,0x82.0xb1,0x82.0xbd, +\0x82.0xea,0x83.0x68,0x82.0xaa,0x93.0xae,0x83.0x62,0x83.0x4a,0x82.0xc8,0x83.0x8c, +\0x83.0x7d,0x83.0x5c,0x82.0xe8,0x88.0xda,0x82.0xb3,0x83.0x52,0x82.0xe7,0x82.0xa9, +\0x83.0x67,0x83.0x74,0x95.0xb6,0x89.0xba,0x83.0x65,0x83.0x40,0x83.0x4c,0x82.0xe0, +\0x89.0x9f,0x83.0x82,0x82.0xab,0x92.0x75,0x8e.0x9a,0x8f.0x9c,0x8d.0xed,0x82.0xe6, +\0x82.0xc1,0x82.0xad,0x82.0xc2,0x8c.0xea,0x93.0xfc,0x82.0xdd,0x83.0x56,0x82.0xbb, +\0x8e.0xa6,0x83.0x49,0x88.0xc8,0x82.0xaf,0x82.0xa6,0x92.0x50,0x8e.0x67,0x8d.0x58, +\0x95.0xcf,0x83.0x87,0x82.0xd6,0x8d.0xf5,0x8e.0x9f,0x8c.0x9f,0x8d.0xc5,0x91.0x53, +\0x91.0x7d,0x88.0xca,0x82.0xa0,0x82.0xdf,0x8a.0xd4,0x8a.0xb7,0x96.0xbc,0x88.0xe1, +\0x8f.0x49,0x95.0xfb,0x8f.0x89,0x83.0x8a,0x83.0x79,0x8c.0xe3,0x95.0xd4,0x8c.0x4a, +\0x89.0xc1,0x91.0x4f,0x83.0x45,0x83.0x42,0x82.0xce,0x97.0x70,0x8e.0xc0,0x82.0xed, +\0x97.0x76,0x90.0xb3,0x90.0x94,0x88.0xea,0x83.0x4e,0x83.0x41,0x82.0xf1,0x82.0xbe, +\0x95.0x94,0x92.0xc7,0x97.0x6c,0x96.0x96,0x91.0xb6,0x8e.0xe6,0x83.0x66,0x8d.0x9e, +\0x8f.0xc1,0x97.0xcd,0x83.0x85,0x83.0x60,0x82.0xb9,0x95.0x5c,0x8a.0x6d,0x92.0xe8, +\0x83.0x77,0x83.0x6d,0x93.0xaa,0x94.0x46,0x96.0xda,0x93.0x78,0x91.0xe5,0x8d.0xec, +\0x8f.0xe3,0x82.0xe2,0x82.0xb6,0x93.0xc7,0x8a.0xae,0x8e.0x6e,0x91.0xbd,0x8f.0xea, +\0x8b.0xe5,0x90.0xe6,0x95.0xdb,0x91.0xcc,0x97.0xb9,0x8a.0x4a,0x8b.0x4e,0x8c.0xa9, +\0x96.0xf1,0x91.0xce,0x8d.0x87,0x92.0x6c,0x83.0x57,0x91.0x49,0x90.0x69,0x90.0xdd, +\0x8f.0x91,0x8e.0x9e,0x8f.0xac,0x8c.0xfc,0x93.0xaf,0x89.0xbd,0x82.0xc7,0x96.0x40, +\0x96.0xdf,0x89.0xf1,0x8f.0x6f,0x83.0x8d,0x82.0xb8,0x82.0xa8,0x8f.0x57,0x8d.0xdb, +\0x8e.0x8e,0x95.0xe2,0x95.0xd2,0x94.0xd4,0x8c.0xbb,0x96.0x7b,0x91.0xf0,0x94.0xf6, +\0x95.0xaa,0x8f.0x43,0x97.0xe1,0x83.0x89,0x96.0xca,0x97.0x97,0x8a.0x6f,0x91.0xb1, +\0x89.0xe6,0x8a.0xf9,0x8f.0x8a,0x8b.0xad,0x8d.0xc4,0x83.0x73,0x83.0x47,0x83.0x46, +\0x93.0xc1,0x96.0xb3,0x90.0xac,0x95.0x4b,0x8a.0x77,0x8a.0x4f,0x8d.0xdd,0x95.0x74, +\0x91.0xbc,0x83.0x6f,0x82.0xde,0x82.0x9f,0x92.0xb2,0x90.0xe0,0x94.0x5c,0x8f.0x4b, +\0x94.0xcd,0x92.0x5b,0x92.0xbc,0x8f.0xf3,0x94.0xc5,0x97.0x88,0x96.0xbe,0x8a.0x87, +\0x91.0xd4,0x8c.0xca,0x8a.0xdc,0x8d.0x86,0x95.0xca,0x93.0xe0,0x90.0x6c,0x92.0x86, +\0x97.0x5e,0x82.0xe4,0x82.0xcb,0x82.0xbf,0x8b.0x74,0x93.0x5c,0x89.0xf0,0x95.0xa1, +\0x8e.0xa9,0x8b.0xf3,0x92.0x6d,0x94.0x92,0x97.0x9d,0x88.0xd7,0x92.0x8d,0x8e.0x63, +\0x8b.0xc6,0x91.0x80,0x8e.0x77,0x94.0xb2,0x8a.0xb5,0x88.0xd3,0x8f.0xee,0x89.0x9e, +\0x92.0xa5,0x8c.0x60,0x8e.0xae,0x8a.0xf4,0x95.0xf1,0x88.0xcd,0x89.0x45,0x89.0xc2, +\0x8b.0xe6,0x95.0x73,0x83.0x80,0x83.0x72,0x83.0x69,0x82.0xeb,0x82.0xd9,0x82.0xd7, +\0x82.0xd1,0x82.0xc3,0x97.0xde,0x91.0xe8,0x90.0xc2,0x8d.0x7e,0x95.0xc2,0x98.0x41, +\0x92.0xca,0x91.0xab,0x90.0xd4,0x91.0x45,0x97.0xfb,0x91.0x67,0x94.0x5b,0x8a.0xc8, +\0x91.0xe6,0x8f.0xcd,0x97.0xa7,0x8e.0xd0,0x94.0x6a,0x96.0xee,0x88.0xd9,0x8f.0xc6, +\0x8c.0x88,0x8b.0x43,0x8a.0xfc,0x8a.0x69,0x90.0x84,0x8e.0x9d,0x96.0x59,0x90.0x53, +\0x93.0xbe,0x96.0xf0,0x88.0xf8,0x8d.0xb6,0x8d.0x44,0x8e.0x51,0x88.0xf3,0x8c.0xf8, +\0x8c.0xb3,0x93.0xad,0x90.0x4d,0x83.0x83,0x83.0x7e,0x83.0x75,0x83.0x5b,0x83.0x59, +\0x83.0x55,0x83.0x4f,0x82.0xd4,0x82.0xbc,0x82.0xb0,0x82.0xac,0x97.0xed,0x95.0x70, +\0x8f.0x87,0x8d.0x80,0x94.0xf1,0x8b.0xf7,0x8c.0xaf,0x92.0xb7,0x94.0x7a,0x98.0x59, +\0x93.0x4b,0x92.0x42,0x91.0xac,0x93.0x72,0x8f.0x71,0x8d.0xda,0x8c.0x79,0x8e.0xd4, +\0x90.0x67,0x93.0xa5,0x8b.0x4d,0x92.0x4e,0x8c.0xeb,0x8f.0xda,0x96.0xf3,0x8c.0x76, +\0x8c.0xbe,0x90.0x65,0x8e.0x8b,0x90.0xbb,0x97.0x8e,0x90.0x46,0x97.0xc7,0x92.0x76, +\0x8e.0xd2,0xe3.0x59,0x8d.0xd7,0x8e.0x86,0x8f.0x83,0x93.0x9c,0x89.0xd3,0x93.0x99, +\0x95.0x84,0x92.0xf6,0x8e.0x84,0x8d.0xbb,0x92.0x5a,0x8a.0xc4,0x93.0x49,0x94.0xad, +\0x97.0xaa,0x8a.0xc3,0x93.0x5f,0x91.0xd7,0x8b.0x81,0x92.0x69,0x8b.0x40,0x8d.0x5c, +\0x8a.0x54,0x8a.0x79,0x8f.0xbc,0x91.0xba,0x8a.0xfa,0x93.0xfa,0x8b.0xb3,0x8a.0xf6, +\0x8c.0x66,0x8b.0x93,0x91.0xc5,0x8e.0xe8,0x8a.0xb4,0x8c.0x62,0x8e.0x76,0x94.0x4f, +\0x89.0xf5,0x8d.0x4f,0x8d.0x4c,0x8f.0xed,0x89.0xaa,0x97.0x65,0x8f.0xa7,0x91.0xbe, +\0x8a.0xee,0x90.0x7d,0x92.0x51,0x96.0xe2,0x8c.0xc4,0x96.0xa1,0x8d.0x90,0x8c.0xc3, +\0x8b.0x79,0x8f.0x5c,0x95.0xd7,0x8d.0x8f,0x97.0x98,0x94.0xbb,0x96.0x60,0x8b.0xa4, +\0x8f.0x5b,0x94.0xf5,0x95.0xd6,0x88.0xcb,0x95.0xb9,0x8e.0x97,0x93.0x60,0x91.0xe3, +\0x8e.0x64,0x8d.0xa1,0x97.0xbc,0x96.0x9c,0x83.0x86,0x83.0x84,0x83.0x71,0x83.0x70, +\0x83.0x6a,0x83.0x54,0x82.0xda,0x82.0xb2,0x81.0x58] + +" euc_jpTopChars"{{{1 +let s:euc_jpTopChars=[ +\0xa4.0xb7,0xa4.0xf2,0xa4.0xce,0xa4.0xb9,0xa4.0xde,0xa4.0xcb,0xa4.0xeb,0xa1.0xbc, +\0xa4.0xc8,0xa4.0xcf,0xa5.0xf3,0xa5.0xeb,0xa5.0xa4,0xa5.0xd7,0xa4.0xc7,0xa4.0xa6, +\0xa4.0xc6,0xa5.0xbf,0xa5.0xb9,0xa4.0xa4,0xb9.0xd4,0xa4.0xe7,0xa4.0xb3,0xa4.0xbf, +\0xa4.0xec,0xa5.0xc9,0xa4.0xac,0xc6.0xb0,0xa5.0xc3,0xa5.0xab,0xa4.0xca,0xa5.0xec, +\0xa5.0xde,0xa5.0xbd,0xa4.0xea,0xb0.0xdc,0xa4.0xb5,0xa5.0xb3,0xa4.0xe9,0xa4.0xab, +\0xa5.0xc8,0xa5.0xd5,0xca.0xb8,0xb2.0xbc,0xa5.0xc6,0xa5.0xa1,0xa5.0xad,0xa4.0xe2, +\0xb2.0xa1,0xa5.0xe2,0xa4.0xad,0xc3.0xd6,0xbb.0xfa,0xbd.0xfc,0xba.0xef,0xa4.0xe8, +\0xa4.0xc3,0xa4.0xaf,0xa4.0xc4,0xb8.0xec,0xc6.0xfe,0xa4.0xdf,0xa5.0xb7,0xa4.0xbd, +\0xbc.0xa8,0xa5.0xaa,0xb0.0xca,0xa4.0xb1,0xa4.0xa8,0xc3.0xb1,0xbb.0xc8,0xb9.0xb9, +\0xca.0xd1,0xa5.0xe7,0xa4.0xd8,0xba.0xf7,0xbc.0xa1,0xb8.0xa1,0xba.0xc7,0xc1.0xb4, +\0xc1.0xde,0xb0.0xcc,0xa4.0xa2,0xa4.0xe1,0xb4.0xd6,0xb4.0xb9,0xcc.0xbe,0xb0.0xe3, +\0xbd.0xaa,0xca.0xfd,0xbd.0xe9,0xa5.0xea,0xa5.0xda,0xb8.0xe5,0xca.0xd6,0xb7.0xab, +\0xb2.0xc3,0xc1.0xb0,0xa5.0xa6,0xa5.0xa3,0xa4.0xd0,0xcd.0xd1,0xbc.0xc2,0xa4.0xef, +\0xcd.0xd7,0xc0.0xb5,0xbf.0xf4,0xb0.0xec,0xa5.0xaf,0xa5.0xa2,0xa4.0xf3,0xa4.0xc0, +\0xc9.0xf4,0xc4.0xc9,0xcd.0xcd,0xcb.0xf6,0xc2.0xb8,0xbc.0xe8,0xa5.0xc7,0xb9.0xfe, +\0xbe.0xc3,0xce.0xcf,0xa5.0xe5,0xa5.0xc1,0xa4.0xbb,0xc9.0xbd,0xb3.0xce,0xc4.0xea, +\0xa5.0xd8,0xa5.0xce,0xc6.0xac,0xc7.0xa7,0xcc.0xdc,0xc5.0xd9,0xc2.0xe7,0xba.0xee, +\0xbe.0xe5,0xa4.0xe4,0xa4.0xb8,0xc6.0xc9,0xb4.0xb0,0xbb.0xcf,0xc2.0xbf,0xbe.0xec, +\0xb6.0xe7,0xc0.0xe8,0xca.0xdd,0xc2.0xce,0xce.0xbb,0xb3.0xab,0xb5.0xaf,0xb8.0xab, +\0xcc.0xf3,0xc2.0xd0,0xb9.0xe7,0xc3.0xcd,0xa5.0xb8,0xc1.0xaa,0xbf.0xca,0xc0.0xdf, +\0xbd.0xf1,0xbb.0xfe,0xbe.0xae,0xb8.0xfe,0xc6.0xb1,0xb2.0xbf,0xa4.0xc9,0xcb.0xa1, +\0xcc.0xe1,0xb2.0xf3,0xbd.0xd0,0xa5.0xed,0xa4.0xba,0xa4.0xaa,0xbd.0xb8,0xba.0xdd, +\0xbb.0xee,0xca.0xe4,0xca.0xd4,0xc8.0xd6,0xb8.0xbd,0xcb.0xdc,0xc2.0xf2,0xc8.0xf8, +\0xca.0xac,0xbd.0xa4,0xce.0xe3,0xa5.0xe9,0xcc.0xcc,0xcd.0xf7,0xb3.0xd0,0xc2.0xb3, +\0xb2.0xe8,0xb4.0xfb,0xbd.0xea,0xb6.0xaf,0xba.0xc6,0xa5.0xd4,0xa5.0xa8,0xa5.0xa7, +\0xc6.0xc3,0xcc.0xb5,0xc0.0xae,0xc9.0xac,0xb3.0xd8,0xb3.0xb0,0xba.0xdf,0xc9.0xd5, +\0xc2.0xbe,0xa5.0xd0,0xa4.0xe0,0xa4.0xa1,0xc4.0xb4,0xc0.0xe2,0xc7.0xbd,0xbd.0xac, +\0xc8.0xcf,0xc3.0xbc,0xc4.0xbe,0xbe.0xf5,0xc8.0xc7,0xcd.0xe8,0xcc.0xc0,0xb3.0xe7, +\0xc2.0xd6,0xb8.0xcc,0xb4.0xde,0xb9.0xe6,0xca.0xcc,0xc6.0xe2,0xbf.0xcd,0xc3.0xe6, +\0xcd.0xbf,0xa4.0xe6,0xa4.0xcd,0xa4.0xc1,0xb5.0xd5,0xc5.0xbd,0xb2.0xf2,0xca.0xa3, +\0xbc.0xab,0xb6.0xf5,0xc3.0xce,0xc7.0xf2,0xcd.0xfd,0xb0.0xd9,0xc3.0xed,0xbb.0xc4, +\0xb6.0xc8,0xc1.0xe0,0xbb.0xd8,0xc8.0xb4,0xb4.0xb7,0xb0.0xd5,0xbe.0xf0,0xb1.0xfe, +\0xc4.0xa7,0xb7.0xc1,0xbc.0xb0,0xb4.0xf6,0xca.0xf3,0xb0.0xcf,0xb1.0xa6,0xb2.0xc4, +\0xb6.0xe8,0xc9.0xd4,0xa5.0xe0,0xa5.0xd3,0xa5.0xca,0xa4.0xed,0xa4.0xdb,0xa4.0xd9, +\0xa4.0xd3,0xa4.0xc5,0xce.0xe0,0xc2.0xea,0xc0.0xc4,0xb9.0xdf,0xca.0xc4,0xcf.0xa2, +\0xc4.0xcc,0xc2.0xad,0xc0.0xd6,0xc1.0xa6,0xce.0xfd,0xc1.0xc8,0xc7.0xbc,0xb4.0xca, +\0xc2.0xe8,0xbe.0xcf,0xce.0xa9,0xbc.0xd2,0xc7.0xcb,0xcc.0xf0,0xb0.0xdb,0xbe.0xc8, +\0xb7.0xe8,0xb5.0xa4,0xb4.0xfe,0xb3.0xca,0xbf.0xe4,0xbb.0xfd,0xcb.0xba,0xbf.0xb4, +\0xc6.0xc0,0xcc.0xf2,0xb0.0xfa,0xba.0xb8,0xb9.0xa5,0xbb.0xb2,0xb0.0xf5,0xb8.0xfa, +\0xb8.0xb5,0xc6.0xaf,0xbf.0xae,0xa5.0xe3,0xa5.0xdf,0xa5.0xd6,0xa5.0xbc,0xa5.0xba, +\0xa5.0xb6,0xa5.0xb0,0xa4.0xd6,0xa4.0xbe,0xa4.0xb2,0xa4.0xae,0xce.0xef,0xc9.0xd1, +\0xbd.0xe7,0xb9.0xe0,0xc8.0xf3,0xb6.0xf9,0xb8.0xb1,0xc4.0xb9,0xc7.0xdb,0xcf.0xba, +\0xc5.0xac,0xc3.0xa3,0xc2.0xae,0xc5.0xd3,0xbd.0xd2,0xba.0xdc,0xb7.0xda,0xbc.0xd6, +\0xbf.0xc8,0xc6.0xa7,0xb5.0xae,0xc3.0xaf,0xb8.0xed,0xbe.0xdc,0xcc.0xf5,0xb7.0xd7, +\0xb8.0xc0,0xbf.0xc6,0xbb.0xeb,0xc0.0xbd,0xcd.0xee,0xbf.0xa7,0xce.0xc9,0xc3.0xd7, +\0xbc.0xd4,0xe5.0xba,0xba.0xd9,0xbb.0xe6,0xbd.0xe3,0xc5.0xfc,0xb2.0xd5,0xc5.0xf9, +\0xc9.0xe4,0xc4.0xf8,0xbb.0xe4,0xba.0xbd,0xc3.0xbb,0xb4.0xc6,0xc5.0xaa,0xc8.0xaf, +\0xce.0xac,0xb4.0xc5,0xc5.0xc0,0xc2.0xd9,0xb5.0xe1,0xc3.0xca,0xb5.0xa1,0xb9.0xbd, +\0xb3.0xb5,0xb3.0xda,0xbe.0xbe,0xc2.0xbc,0xb4.0xfc,0xc6.0xfc,0xb6.0xb5,0xb4.0xf8, +\0xb7.0xc7,0xb5.0xf3,0xc2.0xc7,0xbc.0xea,0xb4.0xb6,0xb7.0xc3,0xbb.0xd7,0xc7.0xb0, +\0xb2.0xf7,0xb9.0xb0,0xb9.0xad,0xbe.0xef,0xb2.0xac,0xcd.0xc6,0xbe.0xa9,0xc2.0xc0, +\0xb4.0xf0,0xbf.0xde,0xc3.0xb2,0xcc.0xe4,0xb8.0xc6,0xcc.0xa3,0xb9.0xf0,0xb8.0xc5, +\0xb5.0xda,0xbd.0xbd,0xca.0xd9,0xb9.0xef,0xcd.0xf8,0xc8.0xbd,0xcb.0xc1,0xb6.0xa6, +\0xbd.0xbc,0xc8.0xf7,0xca.0xd8,0xb0.0xcd,0xca.0xbb,0xbb.0xf7,0xc5.0xc1,0xc2.0xe5, +\0xbb.0xc5,0xba.0xa3,0xce.0xbe,0xcb.0xfc,0xa5.0xe6,0xa5.0xe4,0xa5.0xd2,0xa5.0xd1, +\0xa5.0xcb,0xa5.0xb5,0xa4.0xdc,0xa4.0xb4,0xa1.0xb9] + +" cp949TopChars(euc-kr){{{1 +let s:cp949TopChars=[ +\0xb0.0xa1,0xb0.0xa3,0xb0.0xa9,0xb0.0xaa,0xb0.0xac,0xb0.0xad,0xb0.0xb0,0xb0.0xb3, +\0xb0.0xc5,0xb0.0xc9,0xb0.0xcb,0xb0.0xcd,0xb0.0xd4,0xb0.0xdc,0xb0.0xdf,0xb0.0xe5, +\0xb0.0xe6,0xb0.0xe8,0xb0.0xed,0xb0.0xf7,0xb0.0xf8,0xb0.0xfa,0xb0.0xfc,0xb0.0xfd, +\0xb1.0xb3,0xb1.0xb8,0xb1.0xb9,0xb1.0xd7,0xb1.0xdb,0xb1.0xe2,0xb1.0xe4,0xb1.0xe6, +\0xb1.0xe9,0xb1.0xeb,0xb1.0xee,0xb2.0xd9,0xb2.0xdb,0xb2.0xdc,0xb2.0xdf,0xb2.0xee, +\0xb2.0xef,0xb3.0xa1,0xb3.0xa2,0xb3.0xa6,0xb3.0xaa,0xb3.0xb2,0xb3.0xb5,0xb3.0xbb, +\0xb3.0xc0,0xb3.0xd0,0xb3.0xd1,0xb3.0xd6,0xb3.0xd7,0xb3.0xe4,0xb3.0xf5,0xb4.0xa9, +\0xb4.0xad,0xb4.0xba,0xb4.0xc0,0xb4.0xc2,0xb4.0xc9,0xb4.0xcf,0xb4.0xd9,0xb4.0xdc, +\0xb4.0xdd,0xb4.0xde,0xb4.0xe7,0xb4.0xeb,0xb4.0xf5,0xb4.0xf8,0xb5.0xa5,0xb5.0xb5, +\0xb5.0xb9,0xb5.0xbf,0xb5.0xc7,0xb5.0xc8,0xb5.0xc9,0xb5.0xcb,0xb5.0xce,0xb5.0xd1, +\0xb5.0xda,0xb5.0xe5,0xb5.0xe6,0xb5.0xe7,0xb5.0xe9,0xb5.0xec,0xb5.0xee,0xb5.0xf0, +\0xb5.0xfb,0xb6.0xa7,0xb6.0xb2,0xb6.0xbc,0xb6.0xc7,0xb6.0xc8,0xb6.0xe6,0xb6.0xf3, +\0xb6.0xf4,0xb6.0xf7,0xb6.0xf8,0xb7.0xa1,0xb7.0xa5,0xb7.0xa7,0xb7.0xab,0xb7.0xaf, +\0xb7.0xb1,0xb7.0xb3,0xb7.0xb6,0xb7.0xb8,0xb7.0xba,0xb7.0xc1,0xb7.0xc2,0xb7.0xc9, +\0xb7.0xce,0xb7.0xcf,0xb7.0xd2,0xb7.0xe1,0xb7.0xe7,0xb7.0xf9,0xb8.0xa3,0xb8.0xa5, +\0xb8.0xa6,0xb8.0xa7,0xb8.0xa8,0xb8.0xae,0xb8.0xb0,0xb8.0xb1,0xb8.0xb2,0xb8.0xb3, +\0xb8.0xb6,0xb8.0xb7,0xb8.0xb8,0xb8.0xb9,0xb8.0xbb,0xb8.0xc2,0xb8.0xc5,0xb8.0xd3, +\0xb8.0xd5,0xb8.0xe7,0xb8.0xe9,0xb8.0xed,0xb8.0xee,0xb8.0xf0,0xb8.0xf1,0xb8.0xf8, +\0xb9.0xab,0xb9.0xae,0xb9.0xcc,0xb9.0xd9,0xb9.0xdd,0xb9.0xde,0xb9.0xdf,0xb9.0xe6, +\0xb9.0xe8,0xb9.0xe9,0xb9.0xf6,0xb9.0xf8,0xb9.0xfd,0xba.0xae,0xba.0xaf,0xba.0xb0, +\0xba.0xb8,0xba.0xb9,0xba.0xbb,0xba.0xbc,0xba.0xbe,0xba.0xc1,0xba.0xce,0xba.0xd0, +\0xba.0xd2,0xba.0xd9,0xba.0xf1,0xba.0xf6,0xba.0xfc,0xbb.0xd3,0xbb.0xe7,0xbb.0xe8, +\0xbb.0xec,0xbb.0xef,0xbb.0xf0,0xbb.0xf3,0xbb.0xf5,0xbb.0xf6,0xbb.0xfd,0xbc.0xad, +\0xbc.0xb1,0xbc.0xb3,0xbc.0xb8,0xbc.0xba,0xbc.0xbc,0xbc.0xbd,0xbc.0xc7,0xbc.0xd2, +\0xbc.0xd3,0xbc.0xf6,0xbc.0xf7,0xbc.0xf8,0xbd.0xa9,0xbd.0xb1,0xbd.0xba,0xbd.0xc0, +\0xbd.0xc3,0xbd.0xc4,0xbd.0xc5,0xbd.0xc7,0xbd.0xc9,0xbd.0xca,0xbd.0xcd,0xbd.0xe1, +\0xbd.0xe8,0xbe.0xb2,0xbe.0xb5,0xbe.0xb9,0xbe.0xc0,0xbe.0xc6,0xbe.0xc8,0xbe.0xca, +\0xbe.0xcb,0xbe.0xd6,0xbe.0xdf,0xbe.0xe0,0xbe.0xee,0xbe.0xef,0xbe.0xf0,0xbe.0xf2, +\0xbe.0xf3,0xbe.0xf8,0xbe.0xfa,0xbf.0xa1,0xbf.0xa9,0xbf.0xaa,0xbf.0xac,0xbf.0xad, +\0xbf.0xb4,0xbf.0xb5,0xbf.0xb9,0xbf.0xc0,0xbf.0xc2,0xbf.0xc3,0xbf.0xc5,0xbf.0xc9, +\0xbf.0xcd,0xbf.0xcf,0xbf.0xdc,0xbf.0xde,0xbf.0xe4,0xbf.0xeb,0xbf.0xec,0xbf.0xee, +\0xbf.0xef,0xbf.0xf2,0xbf.0xf3,0xbf.0xf6,0xbf.0xf8,0xc0.0xa7,0xc0.0xad,0xc0.0xaf, +\0xc0.0xb8,0xc0.0xba,0xc0.0xbb,0xc0.0xbd,0xc0.0xc0,0xc0.0xc7,0xc0.0xcc,0xc0.0xcd, +\0xc0.0xce,0xc0.0xcf,0xc0.0xd0,0xc0.0xd4,0xc0.0xd6,0xc0.0xd8,0xc0.0xda,0xc0.0xdb, +\0xc0.0xdf,0xc0.0xe2,0xc0.0xe5,0xc0.0xe6,0xc0.0xe7,0xc0.0xfa,0xc0.0xfb,0xc0.0xfc, +\0xc1.0xa1,0xc1.0xa2,0xc1.0xa4,0xc1.0xa6,0xc1.0xae,0xc1.0xb3,0xc1.0xb6,0xc1.0xb8, +\0xc1.0xbb,0xc1.0xbe,0xc1.0xc1,0xc1.0xd6,0xc1.0xd8,0xc1.0xd9,0xc1.0xdf,0xc1.0xf6, +\0xc1.0xf7,0xc1.0xf8,0xc1.0xfa,0xc1.0xfd,0xc2.0xa6,0xc2.0xb0,0xc2.0xca,0xc2.0xf7, +\0xc2.0xf8,0xc2.0xf9,0xc2.0xfc,0xc3.0xa2,0xc3.0xa3,0xc3.0xa4,0xc3.0xa5,0xc3.0xb3, +\0xc3.0xb5,0xc3.0xb9,0xc3.0xbc,0xc3.0xc4,0xc3.0xc6,0xc3.0xca,0xc3.0xdf,0xc3.0xe2, +\0xc3.0xe6,0xc3.0xeb,0xc4.0xa1,0xc4.0xa3,0xc4.0xa8,0xc4.0xbf,0xc4.0xd1,0xc5.0xa9, +\0xc5.0xad,0xc5.0xb0,0xc5.0xb8,0xc5.0xc2,0xc5.0xc3,0xc5.0xcd,0xc5.0xd8,0xc5.0xdb, +\0xc5.0xe4,0xc5.0xeb,0xc6.0xae,0xc6.0xaf,0xc6.0xc4,0xc6.0xc7,0xc6.0xdb,0xc6.0xe4, +\0xc6.0xec,0xc6.0xed,0xc6.0xf7,0xc6.0xf8,0xc7.0xa5,0xc7.0xc1,0xc7.0xc7,0xc7.0xca, +\0xc7.0xcf,0xc7.0xd1,0xc7.0xd2,0xc7.0xd4,0xc7.0xd5,0xc7.0xd8,0xc7.0xdf,0xc7.0xe0, +\0xc7.0xe2,0xc7.0xe8,0xc7.0xf4,0xc7.0xf6,0xc7.0xfc,0xc8.0xa3,0xc8.0xad,0xc8.0xae, +\0xc8.0xaf,0xc8.0xbd,0xc8.0xc4,0xc8.0xce,0xc8.0xf7,0xc8.0xf9] + + +function! s:NormalizeEncodingName(enc) "{{{1 + if a:enc=='gbk' + return 'cp936' + elseif has('win32') || has('win32unix') || has('win64') || has('iconv') + if a:enc=='gb2312' + return 'cp936' + elseif a:enc=='big5' + return 'cp950' + endif + else " Unix and w/o iconv + if a:enc=='gb2312' + return 'euc-cn' + endif + endif + return a:enc +endfunction + + +function! s:ConvertHtmlEncoding(enc) "{{{1 + if a:enc=~?'^gb2312' + return 'cp936' " GB2312 imprecisely means CP936 in HTML + elseif a:enc==? 'iso-8859-1' + return 'latin1' " The canonical encoding name in Vim + elseif a:enc==? 'utf8' + return 'utf-8' " Other encoding aliases should follow here + else + return s:NormalizeEncodingName(tolower(a:enc)) + endif +endfunction + + +function! s:CheckModelineFileEncoding() "{{{1 + if exists("b:fencview_modeline_checked") + return + endif + let b:fencview_modeline_checked=1 + if &modified && &fileencoding!='' + if s:disable_autodetection<2 + let Syn=&syntax + exec 'edit! ++enc='.&fileencoding + if Syn!='' + let &syntax=Syn + endif + elseif exists('s:fencview_manual_enc') + let &fileencoding=s:fencview_manual_enc + set nomodified + endif + endif +endfunction + + +function! s:DetectHtmlEncoding() " {{{1 + normal m` + normal gg + if search('\c')!=0 + let charset=matchstr(getline('.'), 'text/html; charset=\zs[-A-Za-z0-9_]\+', col('.') - 1) + let charset=s:ConvertHtmlEncoding(charset) + normal `` + if &fileencodings=='' + let auto_encodings=','.&encoding.',' + else + let auto_encodings=','.&fileencodings.',' + endif + if charset!=?&fileencoding && + \(auto_encodings=~','.&fileencoding.',' || &fileencoding=='') + try + let s:disable_autodetection=1 + let Syn=&syntax + silent! exec 'edit ++enc='.charset + if Syn!='' + let &syntax=Syn + endif + finally + let s:disable_autodetection=0 + endtry + endif + return 1 + else + return 0 + endif +endfunction + + +function! s:EditManualEncoding(enc, ...) "{{{1 + if a:0>1 + echohl Error | echomsg 'Only one file name should be supplied' | echohl None + return + endif + if a:0==1 + let filename=' '.a:1 + else + let filename='' + endif + try + let s:disable_autodetection=2 + let s:fencview_manual_enc=a:enc + let Syn=&syntax + exec 'edit ++enc='.a:enc.filename + if Syn!='' + let &syntax=Syn + endif + finally + let s:disable_autodetection=0 + unlet s:fencview_manual_enc + endtry +endfunction + + +function! s:EditAutoEncoding(...) "{{{1 + if s:disable_autodetection || &buftype=='help' + return + endif + if bufname(winnr())==s:FencWinName + return + endif + if &modified + echohl Error | echomsg "File is modified!" | echohl None + return + endif + if !has('iconv') + echohl Error | echomsg "\"+iconv\" feature not found, see Tip #1 in fencview.vim" | echohl None + return + endif + if a:0>1 + echohl Error | echomsg 'Only one file name should be supplied' | echohl None + return + endif + if a:0==1 + let filename=iconv(a:1, &encoding, g:legacy_encoding) + let filename_e=' '.a:1 + else + let filename=iconv(expand('%:p'), &encoding, g:legacy_encoding) + let filename_e='' + endif + if a:0==1 + try + let s:disable_autodetection=1 + exec 'e'.filename_e + finally + let s:disable_autodetection=0 + endtry + endif + if ','.g:fencview_html_filetypes.',' =~ ','.&filetype.',' + if s:DetectHtmlEncoding() + return + endif + endif + if ($FENCVIEW_TELLENC == "fencview") || !executable($FENCVIEW_TELLENC) + call s:FencDetectFileEncoding() + return + endif + try + if has('gui_running') + if exists('$VIM_SYSTEM_HIDECONSOLE') + let vim_system_hideconsole_bak=$VIM_SYSTEM_HIDECONSOLE + else + let vim_system_hideconsole_bak=0 + endif + let $VIM_SYSTEM_HIDECONSOLE=1 + endif + let result=system($FENCVIEW_TELLENC . ' ' . s:escape(filename)) + finally + if has('gui_running') + let $VIM_SYSTEM_HIDECONSOLE=vim_system_hideconsole_bak + endif + endtry + let result=substitute(result, '\n$', '', '') + if v:shell_error!=0 + echohl Error|echomsg iconv(result, g:legacy_encoding, &encoding)|echohl None + return + endif + let result=s:NormalizeEncodingName(result) + if result!=&fileencoding && !(result=='ascii' && &fileencoding=='utf-8') + if result == 'binary' + echomsg 'Binary file' + sleep 1 + elseif result == 'unknown' + echomsg 'Unknown encoding' + sleep 1 + else + try + let s:disable_autodetection=1 + let Syn=&syntax + exec 'edit ++enc='.result.filename_e + if Syn!='' + let &syntax=Syn + endif + finally + let s:disable_autodetection=0 + endtry + endif + endif +endfunction + + +function! s:ToggleFencView() "{{{1 + let FencWinNr=bufwinnr(s:FencWinName) + if FencWinNr!=-1 + exec FencWinNr." wincmd w" + exec "wincmd c" + return + endif + let _tmpfenc=&fenc + if &modified + echohl Error | echomsg "File is modified!" | echohl None + return + endif + let splitLocation="belowright " + let splitMode="vertical " + let splitSize=34 + let cmd=splitLocation.splitMode.splitSize.' new '.s:FencWinName + silent! execute cmd + setlocal winfixwidth + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + setlocal nowrap + setlocal foldcolumn=0 + setlocal nobuflisted + setlocal nospell + setlocal nonumber + setlocal cursorline + call append(0,s:Fenc8bit) + call append(0,s:Fenc16bit) + call append(0,s:FencUnicode) + normal Gddgg + setlocal readonly + setlocal nomodifiable + syn match Type "^.\{-}\s" + syn match Comment "\s.*$" + if _tmpfenc!="" + let s=search(_tmpfenc) + if s!=0 + let _line=getline(line(".")) + let _fenc=substitute(_line,'\s.*$','',"g") + syn clear Search + exec "syn match Search \""._line."\"" + endif + else + normal gg + endif + nnoremap :call FencSelect() + nnoremap <2-leftmouse> :call FencSelect() +endfunction + + +function! s:FencSelect() "{{{1 + let _line=getline(line(".")) + let _fenc=substitute(_line,'\s.*$','',"g") + if _fenc=='' + return + endif + syn clear Search + exec "syn match Search \""._line."\"" + let MainWinNr=winnr("#") + if MainWinNr==0 + echohl Error | echomsg "Main window not found!" | echohl None + return + endif + exec MainWinNr." wincmd w" + if &modified + echohl Error | echomsg "File is modified!" | echohl None + return + endif + try + let s:disable_autodetection=2 + exec "edit ++enc="._fenc + finally + let s:disable_autodetection=0 + endtry + let FencWinNr=bufwinnr(s:FencWinName) + if FencWinNr==-1 + echohl Error | echomsg "Encoding list window not found!" | echohl None + return + endif + exec FencWinNr." wincmd w" +endfunction + + +function! s:FencCreateMenu() "{{{1 + au! FencView BufEnter + for i in s:Fenc8bit + let fencla=substitute(i,'\s.*$','','g') + let fenname=fencla.'('.substitute(i,'^.\{-}\s\+','','g').')' + let fenname=substitute(fenname,' ','\\ ','g') + let fenname=substitute(fenname,'\.','_','g') + exec 'menu &Tools.Encodin&g.&8bit\ encodings.'.fenname.' :call FencMenuSel("'.fencla.'")' + endfor + for i in s:Fenc16bit + let fencla=substitute(i,'\s.*$','','g') + let fenname=fencla.'('.substitute(i,'^.\{-}\s\+','','g').')' + let fenname=substitute(fenname,' ','\\ ','g') + let fenname=substitute(fenname,'\.','_','g') + exec 'menu &Tools.Encodin&g.&16bit\ encodings.'.fenname.' :call FencMenuSel("'.fencla.'")' + endfor + for i in s:FencUnicode + let fencla=substitute(i,'\s.*$','','g') + let fenname=fencla.'('.substitute(i,'^.\{-}\s\+','','g').')' + let fenname=substitute(fenname,' ','\\ ','g') + let fenname=substitute(fenname,'\.','_','g') + exec 'menu &Tools.Encodin&g.&Unicode.'.fenname.' :call FencMenuSel("'.fencla.'")' + endfor + menu &Tools.Encodin&g.-sep- : + menu &Tools.Encodin&g.&Auto\ Detect :FencAutoDetect + menu &Tools.Encodin&g.&Toggle\ Encoding\ list :FencView + menu &Tools.Encodin&g.&Input\.\.\. :call FencMenuSel(inputdialog(g:FencCustom)) +endfunction + + +function! FencMenuSel(fen_name) "{{{1 + if &modified + echohl Error | echomsg "File is modified!" | echohl None + return + endif + if a:fen_name=='' + return + endif + let WinNr=winnr() + if bufname(winnr())==s:FencWinName + return + endif + try + let s:disable_autodetection=2 + exec "edit ++enc=".a:fen_name + finally + let s:disable_autodetection=0 + endtry + +endfunction + + +function! s:FencProgressBar(percentage, string) "{{{1 +"----------------------------------------- +" a:percentage -- percent +" a:string -- leading description string (empty acceptable) + let cmdheight=&cmdheight + if cmdheight < 2 + let &cmdheight=2 + endif + echo a:string." ".a:percentage."% (ctrl+c to stop)" + let &cmdheight=cmdheight + return +endfunction + + +function! s:FencProbeCp936(c) "{{{1 + if s:cp936_bchar<=0x80 + if a:c<0x80 + return + else + let s:cp936_bchar=a:c + return + endif + else + if a:c<0x40 + let s:cp936_error+=1 + let s:cp936_bchar=0x0 + return + else + let wc=s:cp936_bchar.a:c + let s:cp936_bchar=0x0 + if index(s:cp936TopChars,wc)!=-1 + let s:cp936_count+=1 + endif + endif + endif +endfunction + + +function! s:FencProbeCp950(c) "{{{1 + if s:cp950_bchar<=0x80 + if a:c<0x80 + return + else + let s:cp950_bchar=a:c + return + endif + else + if a:c<0x40 + let s:cp950_error+=1 + let s:cp950_bchar=0x0 + return + else + let wc=s:cp950_bchar.a:c + let s:cp950_bchar=0x0 + if index(s:cp950TopChars,wc)!=-1 + let s:cp950_count+=1 + endif + endif + endif +endfunction + +function! s:FencProbeEuc_tw(c) "{{{1 + if s:euc_tw_bchar<=0x80 + if a:c<0x80 + return + else + let s:euc_tw_bchar=a:c + return + endif + else + if a:c<0x40 + let s:euc_tw_error+=1 + let s:euc_tw_bchar=0x0 + return + else + let wc=s:euc_tw_bchar.a:c + let s:euc_tw_bchar=0x0 + if index(s:euc_twTopChars,wc)!=-1 + let s:euc_tw_count+=1 + endif + endif + endif +endfunction + +function! s:FencProbeCp932(c) "{{{1 + if s:cp932_bchar<=0x80 + if a:c<0x80 + return + else + let s:cp932_bchar=a:c + return + endif + else + if a:c<0x40 + let s:cp932_error+=1 + let s:cp932_bchar=0x0 + return + else + let wc=s:cp932_bchar.a:c + let s:cp932_bchar=0x0 + if index(s:cp932TopChars,wc)!=-1 + let s:cp932_count+=1 + endif + endif + endif +endfunction + +function! s:FencProbeEuc_jp(c) "{{{1 + if s:euc_jp_bchar<=0x80 + if a:c<0x80 + return + else + let s:euc_jp_bchar=a:c + return + endif + else + if a:c<0x40 + let s:euc_jp_error+=1 + let s:euc_jp_bchar=0x0 + return + else + let wc=s:euc_jp_bchar.a:c + let s:euc_jp_bchar=0x0 + if index(s:euc_jpTopChars,wc)!=-1 + let s:euc_jp_count+=1 + endif + endif + endif +endfunction + +function! s:FencProbeCp949(c) "{{{1 + if s:cp949_bchar<=0x80 + if a:c<0x80 + return + else + let s:cp949_bchar=a:c + return + endif + else + if a:c<0x40 + let s:cp949_error+=1 + let s:cp949_bchar=0x0 + return + else + let wc=s:cp949_bchar.a:c + let s:cp949_bchar=0x0 + if index(s:cp949TopChars,wc)!=-1 + let s:cp949_count+=1 + endif + endif + endif +endfunction + +function! s:FencProbeUTF8(c) "{{{1 +"still not full support here +"U-00000000 - U-0000007F: 0xxxxxxx +"U-00000080 - U-000007FF: 110xxxxx 10xxxxxx +"U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx +"U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx +"U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx +"U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + + "if error occurs, we do nothing more but return. + if s:UTF8_error > 0 + return + endif + + if s:UTF8_state=="start" + if a:c<=0x7f "still start state + return + elseif (a:c>=0xc2) && (a:c<=0xdf) + let s:UTF8_state="wait" + let s:UTF8_waitNr=1 + return + elseif (a:c>=0xe0) && (a:c<=0xef) + let s:UTF8_state="wait" + let s:UTF8_waitNr=2 + return + elseif (a:c>=0xf0) && (a:c<=0xf7) + let s:UTF8_state="wait" + let s:UTF8_waitNr=3 + return + elseif (a:c>=0xf8) && (a:c<=0xfb) + let s:UTF8_state="wait" + let s:UTF8_waitNr=4 + return + elseif (a:c>=0xf0) && (a:c<=0xfd) + let s:UTF8_state="wait" + let s:UTF8_waitNr=5 + return + else + let s:UTF8_error=1 + return + endif + else "s:UTF8_state=="wait" + if (a:c>=0x80) && (a:c<=0xbf) + let s:UTF8_waitNr-=1 + if s:UTF8_waitNr==0 + let s:UTF8_state="start" + endif + return + else + let s:UTF8_error=1 + let s:UTF8_waitNr=0 + let s:UTF8_state="start" + return + endif + endif +endfunction + +"eol ?? +function! s:FencHandleData() "{{{1 + let lnr=0 + let filename=bufname('%') + if filename=='' || filename==s:FencWinName + return + endif + let A_fbody=readfile(filename,'b') + if A_fbody==[] + return + endif + "check first and last several lines + if len(A_fbody)<(g:fencview_checklines*2) || g:fencview_checklines==0 + let fbody=A_fbody + else + let fbody=A_fbody[:(g:fencview_checklines-1)]+A_fbody[(0-g:fencview_checklines):] + endif + " check BOM + if s:FencProbeBOM(fbody[0])==1 + return + endif + " check header + let bodylen=len(fbody) + let _firstline=fbody[0] + if _firstline[:7]=="VimCrypt" + let s:FencRes="VimCrypt" + return + endif + for line in fbody + let lnr+=1 + call s:FencProgressBar(100*lnr/bodylen,' Processing... ',) + let ci=0 + let ch="\x01" + while ch!='' + let ch=line[ci] + let c=char2nr(ch) + "============= + call s:FencProbeUTF8(c) + call s:FencProbeCp936(c) + call s:FencProbeCp950(c) + call s:FencProbeEuc_tw(c) + call s:FencProbeCp932(c) + call s:FencProbeEuc_jp(c) + call s:FencProbeCp949(c) + if s:FencRes!='' + return + endif + "============= + let ci=ci+1 + endwhile + endfor +endfunction + +function! s:FencProbeBOM(Firstline) "{{{1 +" Vim can probe the file encoding by BOM correctly. +" This function is used to prevent probing other +" encodings by mistake. + let ah1=a:Firstline[0] + let ah2=a:Firstline[1] + let ah3=a:Firstline[2] + let ah4=a:Firstline[3] + let a1=char2nr(ah1) + let a2=char2nr(ah2) + let a3=char2nr(ah3) + let a4=char2nr(ah4) + let s:FencRes="BOM" + if a1.a2.a3==0xef.0xbb.0xbf "utf-8 + return 1 + elseif a1.a2==0xfe.0xff "utf-16 (ucs-2) + return 1 + elseif a1.a2==0xff.0xfe "utf-16le (ucs-2le) + return 1 + elseif a1.a2.a3.a4==0x00.0x00.0xfe.0xff "utf-32 (ucs-4) + return 1 + elseif a1.a2.a3.a4==0xff.0xfe.0x00.0x00 "utf-32le (ucs-4le) + return 1 + endif + let s:FencRes="" +endfunction + + +function! s:FencInitVar() "{{{1 + "let s:small_regin=15 + "let s:big_regin=30 + let s:FencResCount=0 + let s:FencRes='' + " cp936 + let s:cp936_bchar='' + let s:cp936_count=0 + let s:cp936_error=0 + " cp950 + let s:cp950_bchar='' + let s:cp950_count=0 + let s:cp950_error=0 + " euc_tw + let s:euc_tw_bchar='' + let s:euc_tw_count=0 + let s:euc_tw_error=0 + " cp932 + let s:cp932_bchar='' + let s:cp932_count=0 + let s:cp932_error=0 + " euc_jp + let s:euc_jp_bchar='' + let s:euc_jp_count=0 + let s:euc_jp_error=0 + " cp949 + let s:cp949_bchar='' + let s:cp949_count=0 + let s:cp949_error=0 + " UTF-8 + let s:UTF8_state="start" + let s:UTF8_waitNr=0 + let s:UTF8_error=0 +endfunction + + +function! s:FencDetectFileEncoding() "{{{1 + if bufname(winnr())==s:FencWinName + return + endif + if &modified + echohl Error | echomsg "File is modified!" | echohl None + return + endif + call s:FencInitVar() + + call s:FencHandleData() + + " VimCrypt + if s:FencRes=="VimCrypt" + echohl Error | echomsg "This is Vim encrypted file, decrypt it first!" | echohl None + return + endif + + " BOM + if s:FencRes=="BOM" + let tmp_fenc=&fencs + set fencs=ucs-bom,utf-8,utf-16,latin1 + exec "e" + exec "set fencs=".tmp_fenc + return + endif + + if s:UTF8_error == 0 + " even if the file is strict utf-8 format, it is still + " possible to be another encoding. + let s:FencRes = "utf-8" + if s:cp936_error == 0 && s:FencResCount < s:cp936_count + let s:FencResCount = s:cp936_count + let s:FencRes = "cp936" + endif + if s:cp950_error == 0 && s:FencResCount < s:cp950_count + let s:FencResCount=s:cp950_count + let s:FencRes = "cp950" + endif + if s:euc_tw_error == 0 && s:FencResCount < s:euc_tw_count + let s:FencResCount=s:euc_tw_count + let s:FencRes = "euc-tw" + endif + if s:cp932_error == 0 && s:FencResCount < s:cp932_count + let s:FencResCount=s:cp932_count + let s:FencRes = "cp932" + endif + if s:euc_jp_error == 0 && s:FencResCount < s:euc_jp_count + let s:FencResCount=s:euc_jp_count + let s:FencRes = "euc-jp" + endif + if s:cp949_error == 0 && s:FencResCount < s:cp949_count + let s:FencResCount=s:cp949_count + let s:FencRes = "cp949" + endif + else + if s:FencResCount<(s:cp936_count-s:cp936_error) + let s:FencResCount=s:cp936_count + let s:FencRes="cp936" + endif + if s:FencResCount<(s:cp950_count-s:cp950_error) + let s:FencResCount=s:cp950_count + let s:FencRes="cp950" + endif + if s:FencResCount<(s:euc_tw_count-s:euc_tw_error) + let s:FencResCount=s:euc_tw_count + let s:FencRes="euc-tw" + endif + if s:FencResCount<(s:cp932_count-s:cp932_error) + let s:FencResCount=s:cp932_count + let s:FencRes="cp932" + endif + if s:FencResCount<(s:euc_jp_count-s:euc_jp_error) + let s:FencResCount=s:euc_jp_count + let s:FencRes="euc-jp" + endif + if s:FencResCount<(s:cp949_count-s:cp949_error) + let s:FencResCount=s:cp949_count + let s:FencRes="cp949" + endif + + if s:FencResCount == 0 + let s:FencRes="ascii" + endif + endif + + let Syn=&syntax + try + let s:disable_autodetection=2 + if s:FencRes=='ascii' + exec "edit" + else + exec "edit ++enc=".s:FencRes + endif + finally + let s:disable_autodetection=0 + endtry + if Syn!='' + let &syntax=Syn + endif +endfunction + + +" initialization{{{1 +if !exists('g:legacy_encoding') + if &encoding!~?'^utf' && &encoding!~?'^ucs' + let g:legacy_encoding=&encoding + elseif &fileencodings=~?'^ucs-bom,utf-8,[^,]\+' && + \!(has('unix') && !has('win32unix')) + let g:legacy_encoding=matchstr(&fileencodings, '^ucs-bom,utf-8,\zs[^,]\+') + endif + if !exists('g:legacy_encoding') || g:legacy_encoding=='default' + let g:legacy_encoding='' + endif +endif + +let s:disable_autodetection=0 + +augroup FencView + au! +augroup END + +if has('gui_running') + augroup FencView + au BufEnter * call s:FencCreateMenu() + augroup END +endif + +command! -nargs=0 FencView call s:ToggleFencView() +command! -nargs=* -complete=file FencAutoDetect call + \ s:EditAutoEncoding() +command! -nargs=+ -complete=file FencManualEncoding call + \ s:EditManualEncoding() + +if g:fencview_autodetect + exec 'au BufRead ' . g:fencview_auto_patterns . + \' call s:EditAutoEncoding()' + exec 'au BufWinEnter ' . g:fencview_auto_patterns . + \' call s:CheckModelineFileEncoding()' +endif + +" Restore cpoptions +let &cpo=s:cpo_save + +" vim: set et fdm=marker sts=4 sw=4 tw=64: diff --git a/plugin/libvimim.dll b/plugin/libvimim.dll new file mode 100644 index 0000000000000000000000000000000000000000..dbe2ec4ec3d4e1bb91d6bc0bdd023ee755015588 GIT binary patch literal 57022 zcmeFa4SW+-x<5Wi0|W?8l%f@@L=D<%Ws|l*3$3KI0n`>Nw1NoILR(?Clx~{$-y zv||YNx_EW>q6;g#>+ddJ*+r~sA0!7hG5xS9ak1R-rOrC#pP2uY-%%N^a|`Eq&Rkv`5*y2^ok zb18m^A(AyL1nzN|g#4m$CB=?n+}94GADqPN4{=5vHlfHrZc%kLCAHm#pZciGsM}h> z<{wwe5i;5R$RwJTQ9!u02^QP9r5ujwrVWXDoWyX{0XYA->{$hr#B|V!8`9}&oKXjZ zbCfgwOqAY@li+ITA#yOds?zf1i&5oF=e#bN+z~M1Z)()z|K9!=G*BpgGTYUq^Nxbi z7(Is_Q@qz3aVPcocHc^9T_Iiik*aIGF&@9;tKK#a#}cbUKF2MB6l)HwDiQ?iVTqw= z(V3}OU_R33KDeL>_+4FblJl(BX^<9t?OkAWeXEfkyXbvP@0cykH|r&bStn(f10xNB zAT_zV49FKZ_^pRMN5u_$J$s!udU~7&?+C`e{F0x6ffbrAY z23A5J)CZ1!3*74h8-cGy0FQ#zA6$(BzU{XV(!vI&E)sGlk&|-FdaqqC2J!)`pxWk{|Fu#RYD*>4XJMGNW>RB7e^Ptj6UDJKOwr0fpKw9Og1rC4$^M_s(`C=N@J%s{Y2dmr_Gxe+oC~J6~rAw>auj+ zJfn1WUSjKm4=r5Kek>uikZ_Tgrp)z5N3#kWF8Kj8rX9Ji6!#|0X*@6eg!37eOO_GpWP*}o3SNbLR!RN! z-C`q08Bu#-Lna=n5)1XU=clYOY=$>8ihB-=dvw|bP4y`6>dK(@VK;c4dTJSkR555P znr_K{Qrt01S6A3diCU_jiK43m2q!yFif%o0F7CNun$$k_BGOzR$211Cb@o=6g#Tk^ zel=jTZpiey1+A>W9{?p6AQ$ZVScG!*_E!JLT5*rPmFhRQZ;98a#12NnkK5Xhr!<}& zj1mg?^$c9x(*zRJsl0(DKxfmvGxS-~4E^R!kk@s#*Own7&fJU2NpBQAnSg2@G7M5p zZ<)#z7Q78fum{+S!-Mv1^@m${6B+<10QJ(MB{TCD!oZ?^Kw?`T7=Q?&528!4>T8wT z2e*C$nf{ehyX(BhA-c|M9d|Sf!)%G|55Q@Od$O4Nrod?GVtm;#&DomF=4@@I8YEr@ z(K3)QhHwK${rc=ia)Hb-7;sVA`h9Rf`at>BO4> zDDtacJ8y0t zK}*~bY@O zNm$=cG_o%ZJULGgW;hJI;8^Lxw9t01z1!6k!!b__{VMElSbIogk{ejBK~2KaypK^YDm!@2lFeo+tGBC-2JIMs7GYX7E`*Q6w$yFBa7Fz59Yx2Z#uM->yx7fQZ<1FLK zP@h&IR9D9RQyj3FsPnYo$41P(M0X8mcvb5HSO2}YcYgzcME70Hp2_|Vt}Z=EEO&Cx zqZ{3?^oOiJTHAFHZdH5@j#y{bqP0q%9Mq=IGneEfUAd7DEKpao=-B};fNqOo5A$3> z$n3?l)FeLr7cMxpcB|j_#tdFq-#|`-VVMRjlE((r7p3lnu^nuFxMW#a9aN$XXqT+C$>Kev#?| z7Gdr6{c#4BC6gi7%9;oe{Sb(Nz}000j?j&A`zM2wtL4=FaPYe`r=##N$HVtf&Mwld zbw9Y)%N*sx{()>fXBE}aBD(K|X<7ZAqjl~~qP*s}-aU%=2&~lN3HG309okF$TbJaSolataRgol z2FY^_s9jyL9>3@whJ@GKh6nRp3L8!wzhzK{K)T^N{)qA(OSR>?Tv$YU7^nGm~2 zSjW9Lqd@R87To3i+uza3Q0PSQ}41)k$ ztnr@$BGeWF??f+yz}-xWi|aNFBCItc6_zV6wNMc53H^?oMk6by^M?7{CMPJ?!`cHg zAOe2|xg3^k91O1I;1M&6?x1?d8V?J``ug6nN%GYsU*qL#oP14?ud(vgAYaY$_3R;z zM<+jDl%ECp`D^xE$Q$n`6z9wS1nxCmU>Gx9=e@p`?v9F{EuhO0$@XjAj~erXGXO}efb)KE>0>VJJah?2ns-k1%-L;`+qXFjFEk2C62OTVC8!iwDB60{jgd|iafLNn>WwkIu|28OT)7L;)@?iX@cXLUZZyuJ@}^Tyt8yK(XHpOGl=eC z`z>IR`e%yQHpeTm&6RpP)i@3!2L67jOfh#E=WD7w)J1|?$8j{b71#ze84F3w~qtIB;7g=8WG1pleD#vwJhnf<1_&sgTnTn63cqR@7 zE(PV-;Ir=|F}&;o-rpqxUOpn2$;cRkH1Y%7P8(+f!0$3o6@fH!$dH#5@H%4`b_`9e zrgrpun3)_;BtX*5m85qT+rm|Q956^WfPRxKb8S$d+)RRTog2bN$>REaWVy}_uesej zp0Y77aHIEn9o-#uUgI61r@Q^m5e)|1DDkZq<|KNWNk6M}o?g-OI^E{$eRBh z#2t?lpxZCmyQIC3j2wY^)kyndi9UwV`&b}xuTM9LlA=&{p!CXBuCsd4{TAVEG6Wwc z)${fsHE|BBr*W={y%<*$1)J3Icxk9Dv+67CrXggv)Ef9#bQio_)jKjG*+2EMGB*A) zIoHX^e1%<7E9eL2pm^{jR)4OuCTF&nNf@+%E%7yWFYSdCV})8oN7V6NM;m9i|}rYbjUkP z4?lNG0Y8@)CIeKS{SKpds$R-sVbrzA3%!r$mk3>`tFQl(KB4i3QBlVbU+LKgA6n3) zAbuW&y-XrV;W_G<)^EJ&jUm_cI43VP2WoK#q2fF}j#xwo-fUfOTXg&IKBz})+pnO{ z;ss@*upjQFXO7fz|7@?r zY?O|8?>Bf3uhOM|uzIC;nm)a~=8?p9X__AQ9)C@8&$K~0XHrPy!^_iwYUmkRGXP<8 zes+)RLa*Zos2_395b5;vKp}D|&H1JGe!XvMujeq}YOX7*mrgSTfmA9U$y)O_#EVV9 zCml&|U-M+kG(GZr(L)wW@3HyB4DV`lKE#Og<(T7r1x#f$z=<_8*-9s)F6I#b`t;Al zb>vFD)Ai{Aas4{nCI+PGdOSmpF+I~E$F+(a=L5e*?ILRiARtG*6vzXV(_6qP0l8j$ zP3zjLh0CBh79HrDB$)J9lX$zYxy$D;o9HM@nA+SpA_jvqkz6fmvdg(pz z^0WgowM=KC1()F-`jXCbeVB=jIkKvz>(~6vwJ(E((EaKQ_CM!->3x`CJZ2$EyWwxV zHUoMMxW&46Va?t=y)XY7Zk) zDk^^`Y)v{OH4SY<%!wcwSy)*2`}73G z{$+Zz))H)`r#wAmfCRyGs@K-Bw78c^D`TSP6UxWrpRAD@35o}w)5G$kBq||Dr7r+h zv2SL7WPPr)%c<`#J&B$cBVYj&J(#-?99Q5O6OZ)F0tU?g9CrDqoN)$x`C5eX-c<&K zpl8K8sxM6CYxefH)mQFD$TZ(9l9T_qdpMM`pi`o$_8o=YwI7-43O~fuYnOCp+D&$S z-QL>0mfG{_HLG)M(Ik3)4N6j>VJKnZ(gU=o!FY#zZpseKwXKX#vOH``~9Vg+g3S zYmTvmuB*Ey^rY*t?&YF;EHDDjfyE*oPkHT~(pQ*JPHci%rMHXgcR@Gst5XpL8@+SU z+11=gMIA$XY=iWU7*|M(q$^OuI~8*~V%@8NX8^Gv-IE2F;Sj&OZtyg)HjRn{wr47w zTHHM_OFVFUK5|a+KwV&{I#uRpCIH~00^5;|^r|nJm#T>m^Q)BqX{5Zj^kmpX^NcN7 z+<|4lreK)qWJq@7+9F-=8AM~R(Bo8Hw5i<*z?B^_!e%YHtXTw zeRQL&56-4FyM&|VW=qE>|Mp?$@pkdGHcS|`jTP)@+szvI9g}1E+K&Vn8v^cY{b%6v z$VZuAcB{=M9n|$^fjJEjwXnAw^9;!dFK7k?b;LR7w3X2%_3Jit%=%h{;W_45=IP<= zaJArBAMlT%?l|GWrk-Y<S+p^GSl^=?5&d5Z5yt(-Cw2o%;^)wK=h6=$G8Jz$le=%AIW&OcU-8D6wD>fGZnA<^x|Q zzBWA;9V(u5fj=a(_@P-`{|6MFsqlmKMCp8XU=+wp-7_hE@RoLhJRBN%1DX=#K6{QK zbQ`tz%kcm1H>5uU551-v*8C;hf(!MDZLD&{x;xR*0F>S)u1~=&OAlJ8`JHdL9oz@j z150o#5~#mIRk3)5bQN$g{88}=*X`2;jM5AypYs3(J>86CL|$m`DbTBz>(H|ssq#QA z5R(OMq5CQ@8+I8%fo4Ly0;$SpKTQEw@@P_+xc+%$imw%(mZlraB(8r?EvGt;IQ!sh z@O%IX%qYe6v@kJ)jS@KnWi;4afFGz-vsZ$S*uuFSe<-|f0G3|6e$|)IPw**@-bCns zLg;^n;(%oIeuxCrQE(1`$RNNMA5b&2g>&v_^XJrMVz7`3fymETAYSZ@pW(?UwMg$F z#klL?va+%>pV4jOd2Qp_F^PKtWOO9#qzuJAD0|wOU^EosAiz04@n)OSyKA&kvo~As zYS!X@USc;5I593kJR6HLw9oka1nOSo5fNnjyV?bu|W|m<8KO#51t|lR=>r0`+MIv9660QTePI&y%25 z2plpf1J0)I{ssUHUtCGLuu%^w_b<=~H4rv`9UKjP5J^X3?@U?-jzVrm10o)_Mlf)D zLs~ZmqZk((LI=z0`xp;-B^py3g0p~`!^?(uK5!a69$}mp!3cw;QO{Ta`*d22pczMf z{1y6Z%-6D7D)$z~N%n>o`*zZ%cNQifuaF8it*oXYhtm)mEN(fW(Hvb1CVJPbI4y4d zO5?R}+IaPar%NSHA}sPTM|Dw(@bHP=ov}0^Wu1LkfpCF1ZRBI@WSV4B@5#Ej!>(0(pT=I zkBlcM3cUg=0Tr4IJ&RAShBXD>#*eFMQ1Af=4BoLv2{*k|Xw}=GNm6(o$FJ*CglNOL z;5b zKqdGSq6sy!$Zk8z2A!xkqZq()LR7ZV zNE)bFh={Bi?3GEgV{wtPjlo}YjNS(j2h_}HwzrP+E!Z!?*6j_=*Z>Sq6%0`nqL|)I z#L>qTmm!5kRz{>q7v-r8R#Tyu*a&!cXd8x{Hfrv{<>>39#_Nc;u#QhP=XIOk#bxal za~p{Q{&v)@pH2Yql?|({*;<$}zoW&kX1$@RRWvVQF?z{3W_? z2FBpE_^Ee&8zcTJmTg_<(#03CZY#RyVpE9g+z-U{_u>X?Xn8FD_4GP^=^X;^d$&(l z>&wY%lZJ%;g~k)Dz76JDAPw9UM328ChG;_|4;v?Nao6sn`eajNpr>{IVGnT;+Ug@L z!5LuV4fqsc4>~A;O?9zHpZ!~`5r|Jd3YP~(bRrXi*W%*hPdcv!{hE6R*hG{Rcq$dw z3^P`mx&u#um*8d?u!4!L?f@NXl4?kNVnGD!E;RiJP8y*n_;^iAIiKfPyJ<4eE6S0ahOo#0fp=DI???& zWOMypBf7t4H(JL~*Wa;$cjKUNWrb_W2%*U8C2jBu6laR#Y9VZExe99mz%b0<_(V7D zk?E@romZd{R|4q5p(Tm#4h9Quiij-L+d4BLVu7~79C(`Q?dNb(46~?UzV#BA)0lTi zBGjwR38LGfpgslFxXw8pn`9L;+`)y4q|J-OoW54B*nFKd=3pfD(=oYY$LC*&5{;I=LKFD!Sjq@7ll844CLy z08@qZsZg{Ek4_AdZ42HJ73@e{VvU9f+u0Zsg(h#xk0(_UXH@FtXecTno9!8x6 z2PTJvfDa)qA{vDz^=Mh_B_CCrHg} zKfOfl9*;K%Zh!(Z1y-|%AQ1ycm0DmFsf_`hxaE+(@gsUUAysOGIaWo@}NMXP|?Me2vkgZ>`3UJut{f3vMN& zU#r1ynd_{JrHSjdz$W0HjJ_wZZ3*>($__pWknA^5uh>`;!`?y5Nf0+^BOOhmyKQJO z)FcyvG{&dJhXh_Lbc2o|cr6Nzp!Gi`^n*8{dkSfS)XrdqyRv`^A<*K#L5DBGnzc?dor^J$vH z*}kd9^wt$UG=;PN2JlDw7+ikcgKU2X&9~7sOdL$X=yjN5B@9A-gAfo7XD>`NyG|3r zB4Eta>^iO6@B9Y)OtjL~^CY}2#LAUX5$2 zrWM6)USX>AzV+~#9(a7LJK@X_J%b4mktsm553bO#1K-}v1{8HP?*;PlR=@Rg>C4S=Sx8F4V=kK$H4(k=dKoaLS&w?1f>$4tYc`EUgQ4|T9auG6d$Az~`HAmb z`xj76z1;!3zy_A<&=w`9;Cf3Zopp6;ti9=2Fe9?mNLRc9MrcMi&SzK;k~Z(PSktk& zg1Yom^tj?SSGwRFtIWr^%FQ+%LHD9mx&!&cz>>|2WfW|Rg}z9u(tXs|XSnv|vY;Mg zlA~DD12^E0=KsJr@k`?wph^R5{Fz%&!ABI4T+KRwQkE0mg2{IHA4o;=pbEKUNh^K> zK5SkM78E=ysWpOQh(rRVpIUJfiF7>|1*XPCfe;X-0EM*J%lWaalp<-SF*pGT$hPUA zm#tQ#`)dKyGng<(7^fD`QP9Xi6{evIZQ#c2xY_ghE)?x`jP?#D_F53Xz(OK4^%k&niU z?OTqBy*bQg#H=@!q0Pzt(vVB@OnfvDeYWRH!OO}(?bMbG&==b%U(E=CGto_36B$hC z{~)$rF@|A5%i#eZu*5>8tYGjufD#v^(z?OHy||X4K4_WOM1cicKav_98JqKIbGLDG z0bSTa6Yv-SmV}y}DRY*9x+bX+j3odQ);^g3U}b%|=Fyia@AUUw&unO;jeLZPD>8wj zd=IXgP}XC=Vfg(hGzqAVRWx%Hv7);Uk}{H>UbYw}Go9dALW60?A~ePEAqS}d>?_qA zE7MBD@(;r4Yozu-DFsu0X>ZL4%{A!DHSbSG%nApaJt># zjx|nP<+ni^Iw1;B#|D204a*u0C54G6k&I+!oc=X1zR`g$L=cSdE1GL$s_#hMq0M1` z(G}0+lhIvHvk4G(v@Dhx>NIgRt_OBfV?#IBvPl8q*~{f@-Za^7q1Df3h-mHvAs$UE zpiF^RD>b_Q`e#??5NR0v*~uYjv)@Cg~ao9|x@4IaXTGDhDTlIdJRfW@$o)98M2Z3`mQ2E_N1+o_k@=1XUcz zSZW0nYa;w*L@=WFt}`D*YKzX?;6fG9;EvXVq`hnR5rOth#he&}*AxC21rTA2OmGhogz1KSGQ8Wo4WNj+X-;aV2|qy5Ko?S^ z4f`KrH2ZCn;Ye4XA*tTJnrWDAt{^W9^$_%o#OQ)mzf7)!Uld$1Vm;UyO z)0pBu)p$-DHNSV4H)*}+bL{6vo5W`9ZmN%#Y(%qQpIL5j6>_K<`MAP;Tlr)c^{|L2 z%F)L|I;tV>b|%Ad9&2_CYK5r2)fS4`C?Jw{vkH?gNawHsBMKw%U4bcbuq2(u6#Q{M zaW}`>l-P9QuWLi&5zrjfnLGBo_F*UNu@P;+*RlWDh)#YT)Q;cK!9P{eq!4Eq-%FU~f7MSyKt$9&=;uJ<*M=_W90kU4C{r5lL zt8asYPDC1aq6Ov|vhDeDl6xCFV>NaiI*RUu`7B7E zk@&6j)jeX}$e|E@K7t5x{SKIEK1{am3Z$ah0aU|#&`Q{LDqexuZT3S~!`ONmJjt2% z8{I5L&KOiP%(ayz=n(jE;6ZGH>rMEOUigljJ?v&RmW3VWqLq`OeZq)V7Y{ZW7dc4V zhcqy<-iB&`l=O)Gg&TMk6`(LhQJAvXND(U>zVsFfk)?X`4R^B@@(f43xGoV|?8!05 z>m4G*$zaU{+a4$wS#2)5f=y+jP0|}En17=P4MEoMTywtYnS&=;kJcX2By>~Mf!ESd zdOq)Q=bLl!P$I5>b2!**Z@i#$b&AJzZ;`@#nv9O?I}RKhU*r*tZ({IFuScUdD>=S_ z8ED4=?4G`o|Z~+0HcIK30HekeLtk%*Q_><9xE+Ku{f>$3J6_ zlhH7acgXDwoa91=`3Pkw$jgUMDneCJgFMsL7#Kqqdj(A;w}~Dd)C5?B-uNm5x@Y(g z2g0CA*k=NCP$(OeMqK|9_Nbyxitb6DZ>|*AO(k;$VB&`)8~Pva3&gs&!5KUt1rQ)g z4p{>$$C(yb6pK28Bp8tXf+nCwMD?wsIA(|vCn2IB|7|8}O(;bvfikSgLnsSGs7$;ddY%Io zna#iftmuO;GhkCei5zJvFtdPyu>X)_H;3C7)G-3(DPE-csAQNt!Gn65cPjN*j~l7S zYIOx*o?|r4qyYriTpcLo0RLkEO^x3|%o2w=+>Kk%r!cJ%GMw1W8wcccZ$@qEBs9Tm zIVg40Ghm0F-w^|>8pIb#vD^!2nQldQitr z5G0|wv*1Vc*kGwBl0Zccqf=oTfb`9{Z??1Ne0ZN$(6UKdSP=D+2u+5{U9FUe&X8gX z6l9zXjp@@x6X#&VLK0OW9+hnnB+C=|Di2;J-^dz6@B@tNkGHc)K-uBJ{EGmZ-}u=W z80m|C*_D&4`jlv*U9*7{2>>lZ_jP;FE;)aEE`v!w9g!J@Wyy!tLp)p@{&h?F6cA9dE@6fJtCoMv~}x z5UrGt*|_?G-%uT3LU0cDWI)k=JPtkYyaC2VArl6J8dtXljwwT+PuIXfo&pBiWwjY2 z$Ke}U0jCiq3A{&(dFMK0pk>JpEknzDHcu(ai92%5OX~8N+q9=|WX)Q1Z=)uNc5mIk z3#LOYib7#FD!UR~p?)pYa#*u*{{avXkme!~UGjGU49qbFPNJViViL8c=xn*^zQwZ> zdS$Nz|HNL*12&49nIHM_7YOeCQA^;*{Ibk-odvE zDri60v7b)4aL3ynP3@<@tMwl^(be(xC0f6m^FU5OeBx241WurX{&jpId)G$?i|#id zu<{Lug5aw(!5XlCD+J4Mcf13t$e@sc7UIZe*np^xG{Gx29KE9MPxY@py!N>H_y?ii zp{7TWeI1wUijUUd?wg{lxG~j~qU<8b+2;PT51OlP_j=-4@MfX!!xb8SW zQ={TB1B>OQ3kdByP<0~!FNeYuxu0@~$J?VK_YOZI_d^##@3;Gzeey{E#g*e&|LYw7 z=+K_MsFG{olfv~*jnm>dXAjn*26*SfI+)Yc!E8`=g4hseYyIYU+8B$btV|xVW_&-q5o^Zt;f8eV&BnkY*b~h4 z=|94yi5?9k$3SWc*xy16Dcsl05Z7-)`+J=Q6Z5&%GGQF#7#*;8Y`Az2WQn5d5hFYk zMN7*2Zuf*ojd1dpzVb#=GU42{ywc~+ru03s>4oEkbcb2%P)lI-MxSenF1 zM;7AdyHu(iu6V>KRbC^r(h644+Ll26C6h$=5Ilw(JlL_gR*{CNX7(_RI?M&)jsp1q zLct!qk%(hJl-P{7aIS|5d1u8^xIGFUI#^B5HWskFu4aQT z)&uPezNvcG*&!>gKhuI-WNij-;V#z#bp{8ayy(e-&Uuq?(~3aw zCaQx~u`~voM$c*Vj4t2x6QibPWVpdImf0>QZ#KRvui1l3fW@OnhxG z%?;gxDc`HgGJA!U^XfFLGFiNMB-a-V?2Sf&1GZQvFp z=mVo*Tlk_BhB12Byb15Ny%HFKxdXlw0PJkF@4+UvKM{*#aZsO0d=2)D(bUcTCeyL^ zd2gV6xe75jNx~6B{6WsMJ8Cc1@Q{jtuXRPptTQJPduAv zj8!J@G3yOOO!dam2Z9{avD`N&{mbf!;q?jewUNj-5=*$!Y9ZD(e}kI9P`U(T-n-%jIs-V0 z1xHv5jc?jxL@xirN~+n_92ZDofVz7g`7#!CCX}E;A90E$ln+qs@fa9F zfar*$l<6pK1d&*X%?M$Co-zv|fCNK<eHook<=$)~d^cz|Iq$G|c;zo;)XE7B3ngQ*j` z3j8Y!%JuEgHCKD%|7Zg;nBs8y@&S7YW$_WfsUv^$#lAsfipI}k2zs`6L_ED~*m_4L z$~2yh(X?fn;OtjU^63sqZ@aSD0My;dnRUpOR zM?DWdQv-*wGxV;!eu4I@r()nR-SrdQ(3&e;_)0)<6kwUXfYN@7H1OFE-LoW$6a#tV z*)4-)d%fwy0$huHy*vr?bMOZ+avPe94Xfs^w`di}gcSCc6M3N=^se#Bh6Gy0h=qN5 z^8_qcQ!8F=jy>~N@zrziF4SDHonCzPZOymH(`(*|p@}jFR=KcBI1*^AM|)|6M9q}G zz+k7vYfSyo98}!u-=a+X&^E{QfVQR2)7KCiCVBvF#K(`v+N7!EHf(6uZ0Q91&utP^ zb_42BdJ8K1+;I}HHs50g-d*4|!$Tf{fp#}(?2x12>NYN9J+FW~S z^)=q7dmOJYU{I32H#CB;MMEwu5oT1K0%(b=B^J=+PBMH+uTmj+WMBNx(?3AzRMZ6x z2a`nC^CX1w{w@lpdT+yW4#7aJKf=Hf7*X3as5h}LiY@dj--{Uxa}dvbf=p71Nki69 zfaZo7f-B(zF{g=^9rHv7A=5LmJ`&JLL5(>2SW{<3C0f z0M152cnT9mX`tX-J??fzM567U^h5*DStm%@0a-@8tvPB^*53dgcWT1}0gmu!+ z80V74Z{bh9nUz0B(?@sjhX&3xQ)N1D?)N^zp>G`)?-;bc2c-`=h@%S{)k#U_fRS}e z`25r(c#@6>@)4>W`qtSd1z--$PLb}_dB`uY21oU*3p@faZnUDO8Zw3su|7VaK_JLT zUBUbO4+A11^^nBKWtan-$tbXj41)3peM9eqkh0p#Y?MZ@id+tn#XdEorEa$V3ExJeIC%ahyv&0q zXBPlz(uzVgSgq@mF}{q)9XuSh_9TYn?qK(=R0<2h!6Th0VI0~mX}rmorw7YanSZOc4JGo{pcF2l+17&RE=dsR5k!K|HUkz|^ zck7XWXTS8e=zbNCJ5BhJ-cRg+dQS~)lkWv@5^X^SN}tPHM(`-i~>w z(=?y^`ajVW2yMsHHjGDcRH5e5gNS;fy!HUTp+=VJ7IzDC4*t?$9@;9M!k5pqaJxqW5_ULX2ghesonD<8 zJxq-AE@l4=`Aaa6*yPLZ!q>WyIo0SK(lV7bC$d$rMOJBmk)ZpHZQ@>%wuJ!S>ChhB zgm#AeV{(^zIG8M>?>>0R$J6&#C%GPp6`b;}Qn2A_G9mS9?=TEkyK!d_cjFyPnIEYg z1KX&hcWmw<{@u`W`Rb6bbLA^uwKCH8NjJ#XP4ac4d|fABpO>%o^0iLBu9B}M@^y=R zT_Rs=q+^#UB0%-*G~DmTfT0SulwX{yL>$; zU%TXMt9(7iu6XCz)s;ryw8mHC`8Vb5M*d}M?6hcVv3J5&@c!gUx=4k`Bxk$y*g@xv z^t0j&=yOn5tU&i8LwoJ*lD*Sg*y+tXiBAVgg#mn78(VDiy7;%X zr33hMs5kFmdfqYY1$1^w03&z?Y$srX!)GMA@Rjv9@WsmRF_OK_S&Yw8rrQsS&-v3A zw2MDwFJ(Bc1Rif;d*TPzTnkNU<>b8SaPzX z*fA2|AlN&UwlIf zO10xNm-G=)e4(^i%IkI}rMIuZrfTVfGd)tH{0R^G_!M4dj{NBirH#q?*8K=jJ`ms7 z%PJ+{%u7GQhW%74&ThF@oWIA%4F3ZfAHg+_&)c3k1)A-&eHz~_BmDMmRPvb~qSr{~ z0kR8FD*@)Z6B}U@5FVe=WJ)+G{YCl!T4+HrN@mJFd4v=nV3lwZnfSav3bda&BON(X z+ATGn`4oei=9MG4%E26|Ty&2_Mc)-1LGCvCxKH}4t5Kf`pDt7x@o7<-Pa7)SLDx_) zu@U!Dr*shUk4@LxiGnEKOHD($(*6I`V++PACVU##1_7Ji?CteW!77w2EX{ggI#sw9 zCrw0M>bMh1nvyzx!o;-nNs}`&@r1~#SI}rkVY%L(~6gtmzLlYRi^Ug#U-XWODn3EFaD9KeCeX9;;Kh( zBoJX+ykK0mwBq5F%dD1hCFSKn#vUC@suot2E?d5$bm5OmA6Z!9SY8#K6;8{evh+u= z97~s#n#w@YSyeh|m|!y9zqHEXEH1y#Sz7f7%K$57%d1RdOH7L%agT1*2O5(+2Dy;ZX#qyOErpoG4XUTFC`+G^nj-|^hOpBH}Ow~&tEk*Hh#Q1l?;*WGW zmM>mjZdy@VRZWHEGWoOanprSyp?z-ty)*4I3l`?wHT|xF*}}}?nSziYR0vL?9RCu5 zJ)y!`UY;o2RZ&KK&CL>wos;=#lke|{N>lQ_unETZankc1T<@RC@9&ha3fw@h%Vc_Q zW^kN4fwKzdN||1vd?nmBz#UwUhEpydo!@-t<>3`L_Y@AZ59Nyi-v$~!oOk22;H0!! zGM+2&Oyx%6nQ&X=vXu5H%9r7crm5UhI_cZOsszekTCvpe2&GWV6@=pK<%@swnq!Xv-PADMGxithYlFI;`chK%HS(+lYt){%w3v}O~8O*n-qKga{W^0^7u zN}S^T{G5_67!MQ*Mmw%;xB|Z4(amV%ubJ6+#smCndzxSCn)vmHXW6yZJr1<-x5}NUsj9p&s(=Kp68 z>~HUZr%(Od_hXxmKxYD;9XS0sH`QWK_>Toaz~|7rvDai1&U);#s)>Wwjs@i zEB-=>fWIdqtnP1sfU74T^r1z{ARE;n#-?2J8pFLJ(oBR|;1NaOW$Q zE?c^cdGG8QS+iy@%(u^4n0wbuyRh)#QpdvOPDiEFu@Js@S+PS{R9sy;A$4I%>0UbuCyY$6o2YlDmtySqC`O^C-*@{ty|`!+EMHX6JhDRfSm3u zD=V$C3X9k^Stwafa)H<4a{1m_#qQ9nI4H$g@nh$5AapE7M*=2RF0DvOrZNQgzsLV8 z8YpRtNV@Jl{4LHyXme3%?MTBYR50LFj*Ce98qemaw50a|b6A1sdrd|9RGhPLF2Y%k z(}A-VXC2OGaBjr81?N_rJ8=4OzJs$J=SMiZaQ5I7jv#Ks8H@7}dm>V!&5?5h?pDXxId zFKF+o&Y7A$JGZpBWGV&@cIbUv44zh~5D3tD9Y3T3RVQt1Bq427~vrF76GTJYoUA4oHnnt4azR!wABMIt4|+@-SZf;aJ9X zMX4jZe0g>0jN*!t@>1c2aO%C4r4?Dii+!F8tIEOMufl1wAlozy)&$}A;k4PMj(aOf z_kbKN%$c2)U0zyT;j9#d0(zS5D8~2-PfrMoi7pN8N*%(J0<5Ki*#B2yiDP+1weXy< z6ud2@p_cFqp{jH-Z0VN*>lcMz3vw|8B536Q7tdwYD;8HdSd1dXg3f>CyvIIkrad<$ znPWpN2Ymg{Id{!O08}t8CpTBfK>j~E=gdxC7{SO~-v9pm56}S3ZV^YS{jJq>tWz5T1l<~uis*Fc79?y6xPMJKVh-RHki1~3TwLEI^S)RANX!*6}HA|!AZOglstE{(JldOf- zmDcUnL)O1oyQ~wFvy*+vFC_0u{x(^k5}R^eN?OY7l!sCtPkAL}f6CF6Pg5qPu1H;* zT9^7<>TgrGr&`DVAp^)Q7~A0T@}zx}1snQF+*hP782|A2-;Zw||LmlVlMYQfHc2x% zXYzfM4^B2`OvrdR>aTLxLLvQDPYpb{wj4x>gm+p)G_048J{u!4b;@`&g8+?sqaxh?tK zPQAroA(8*59plPa zNR62?jB9%Z;b9F%c8Ef)<1iG9I&|{A1`RGo6O|ElYn1O}aHSI?bexnLNx2W zNoD+KOv+>Us%T>jQn)s-zC zz%YQP@Y@|uQDoA{NZM4A5jR(+oo`usnp!Damr%p|1bhf}bWh|&HyiwQYQQeo*hD}hlbC#NjL z^e{~moAe4EMbDgP($6Wdl)%aAaeXOvfEJX zAKBPNz;M~eMu^CFN?lkGl2B#G2rBA=qGub+XD~~tb(<&BpUQwyQ7N7>-Uvc{Qc@Fu zwol50c2ugIB75Vs0Z~s-QBP7)&rwmo38ec{w+)DTyo$O>MLkVLeXxr9i~&)PQ&Eps zQBPG-|5l~>`~gvqRZ)*qQMah5f32cEcRNXYi(JIXs4T!o?MLkwUJxN9V zQzHA6-Hs)*)gPx~T#2KTgO z#Xl;=L)5XPqIel4MWiTmEOA!+2$6Jzmh3lHDN=xD|3l@+E(Ie;aW)jbtQX}vOr{|e zlT;HcL*pVJviD1k@T~a5D4u26|BN!1lU?z~|BZ5`(jOV)a=}RY9f}kdMe~}=!c0t3 zY(qmE#QPp9x&EnMrVH#b4#U07S%qgMC6%I?J}?tjt8Bhjv6g>|`dJlqouZ8}b&8z& zQs1tkUN<1>-74xA`_oE|?VmDXor-$>fT(}1qE3NCA4yZ=RMa=As6Rg->H!t?ulv(V zHS|xJP!^#sx47dl#>=%h#oI*iDBdQDmh5ddDN=xD|Kt1iHWUprJ%5L{iSVqn(r4>R$iVjCJ%O20!HH+>V99kUSq#!XbD5WH~N zO@j7Pb*ifOOVE<%3Se|{j7^yP9;*2HQncjyqSnOg%TZok?W~N9Kxo(L!c`>;9~G$o zfwM)A#Z!vetO!pb%EiF3joIp@n|Ez`zzTarh;ykwd06kLo`{E0RxlGE5fTUls_Mt?m}E!L9D$#fvY|QvMzJMZm+YrE(mN?zxVb zR@u{QfT>jMM=chEIe_#{3Jh5<(ZWkviq$DL#_>>Hyn=Fl;|aBmQC;;VsI<5uWyCvsIJ4b!@mq;e}L0Z$wcwo~>y6m4VzhHC@Uw$+Y^ z8UU}<&NfV;01Q0$LqagJKm5<|TuV6Uyp;9ImYEmk2h9Ro!g$?^g(z=lhf@K}tiPlxn0{Mk@71m^UEBFQ*XSg76#G&0d42UE!w7!gv<`-8MdVTL6xmC| zvagV5LHioVU%)1p{nD18<{5wgj#;)s>7TRb{|wK|BRumN#l9>HLGWzEas;y|!1g~B zo;eKF>3D$jt&e}k#{M%r(>Jta56QPQ_v86I$mh#EU&<$t48veJn-mx()D1|nUCkvW zs}h71Txgd!$<9-z;?j1ll2TT=l=VDe-@;1G0*nnEYNS*#QcTxJr>sWGwmvD(AVs(_ z8s`5XrMpiG{rS7jo1$S3BE^4mbjk^&6pf8e`35PKxA7Eh*k^M6P<=gP5`^ULQ|*Rn z{UbZ%FhuLhK6L0ok&B`o&W{QtJh%Lva>;$crZCSX%a&Fzj%Jr3js?%g376-YfXsl& zS72Bv`i^FOpOh@5YzwD^TO3OvN!uX|Dmm)-z9rojmUP*oD#!Ab{bjuu9CoM4RtMNi z9SZ={h795qBLx{z?IguAsZ1qcI$6FVkqarN$Lv!VTc}fnxK?rR{#3qcu4lY02BGt$nm|&F3S}R%XP_yEBpZ*hIPo;XhcfbZ?Keu zNT~!KZqJm|ffUp1%WH#Rx&T9SgOO6_ky5LaA`oE^<`Om)$aq)^%~-d|DO`spq}cl4 zxeY1xg^E_G*hHjs_DPwB6yuy|nEMD%IHl4up7m%ZlxDU;XoLlTX`8E*T39*0no=vV zh8U4z8DXBMz)=2AkYa(e=dF@boyW5hoVznMoQ&EB}Hi|T+d`J z6$U{VOX$Og+FFdrgR-IyrT?O2CWWRJU+wREC~LJg)DUkew079{P&~ks0N^d<;Y*s- zA0b7(B83VI$Jqp!qN4ti@=_#etg4(MX%Y}{4*POPPl}|qN`0xY07jWhDdKvHth$CV ztMMqa%@dQrH~vG9%Di7LX!J=*EkS;tlnJR|SWc0tHw=h+E|B!WJic5--L0bjjEcH{ zK-3FV)M+NG4?n5vRMfYqsJ9M?dYX#*Tov_774=0b>TLs}UZSGzR#D%mqW+GGdi#K= zJ5xa$@i6AC?1Hft5i|1S5bdiMZHTU zyM92_Z7S+TD(b6L)E(aw^$ZpD`6}uT74`D(iTV;1^*R;xO)Ba%HbOyagK~>A4oLHJ zRn%9hsMo8gZ&gu`8xZvz6?K|BmF4350a7W7?~^j2Rz=-3AnI-vbsER_p_RH@MV;nT zWEffV2?L@&Lq&awih8YzdYwvk%YdjCsi@bgs6Vfw?pIMy8xZw674?@@)cq>zx2ZI5 z8xZw;6?Gc#ATiRTrPisaZ;Z$;kG6h|6nSn(wYvtzg+o9&gK=p3&UH@?1M2ko|9;2! z9SP?SNMrL=8e6T>*amRkM~4%3L^LM1l!5_Kx2UM+tEewgQJ?xfQBPG-FHli0S5co8 zp)Om?_V2J3Wp_kmG@{rS1#MrR%T4@K|rFQp=ZGHRJl3xK6Q+@7RkKmMc6@`=1$m?p82|`FU62 zM@dQTQlwB)CY)Az$oa(si3VwIg4Mf%dAwgmyH!sXp?}H*noE&2Cbv_^fT$l-Q9s$AR_aBS?Bi6_R}YB#Miuq#D(VMS)N@su zcMphqgNk~aih4jr{R0*CbpxW_s-oVhqJCCI-K5g|h5=FEqM}Z7??{Y_N#0dauTsgr zaX{3cS5e=lqTZ^ao~ok0WkA%os;KW%Q9q`lzClHO>wu{HRn*&6)Vo#GwW@mGJ|ODb zRn!lvsGn3(Z&t~^dqC9RRZ;I!QP=fPnUJrNecynnZ&Oik?N2MUQziR0mFx!xM17x% z`Y{#tuT|9JBC^Y|jSc)S$n*TpJweMeju;aQ36 zqIi~NFZ&MJmALM|QLa?IQiGR|*~WMOW0;BUifw4{w{b3Ue1d!~*LRQXBC;P*)#~?E zr^H@2_}RW#USUyDimZch7#eBbtb+Q!_`x?y7nOpi&q{dYIT+uqtDpoygI^*$I6P-{ zQih4q+(7_+j_->fLV5xEaTIgv7>41vg0^bP2T!>JDaxppr%aY%=!vJ?jT9xO>bZ$|S^UJ3ppq6OPv6qW!+c_)IWtU-zr*P)d1fh)$LQtElYC~y7nQolip5*6^2 zH;|%4r#$6dq|iY-T6xOHNKyI}p7M93T!cpOUxv8~;7YW^VQxi=GP>a@laZqMXPz<_ zDN0WbDdZ1^@f9CMik|>RiAexMA8E2#CsZ1u>tX|7N?;hAAKGhOzHqSsN6Yrpa$1`K zLkE51nWyZe6k~MCVFqK0g6TpE;fa*e>roeBT7+>lQs^MXam-0bQTjoiayL@8v)WN$ z9#WO6M2ce1ywsyAn5U3pgP4>LZSc=NT9p+{(jm$Ir~vgu@$)m3Qsx{u=Krs;s|&HJ zio*9H>P5;2qX+{ZvP3Lww2}zD=$*)#QE{$dA?&$xe`XHeKkl7h37SAiM92p#AEKn9 ze5epIC@QL_K%xvJB7#EtgXl>gEF${WT6^ui*SUA3fq`?rz4qFFYp=ccIrn_)9U!Mn zeLexA=N*yx3dm#70~hVv^&5~wq3up++6wXvZJn370+|iS5pClp|Nc1YxfRGGMrH$$ zZqSUR!UM@$XQ|IYLdKBMOaAO{WdI*^mbem(&5nUT2&F4u6wwWIL6iC_h&(}co%PHxN zpMmJP8#VOAeDZ!rt>rJs=%3`e4L`WiFJuL|8_4YtqRA=92$1D4?qc((4E|&e3R2_W z%EVc@1G(1JbxfVZ&+grLc^SFHGMy(Nl(+3#!*S%gxG~5OIUM}YLDL&gLWcgdbS5LL z*twiRW(+dEEKe#ZPrtRSIirU(J_lqI8XZUQG>}tfyxyc-M&@%MYYg%&A+haXFC@}M zdGDa5{{orKrd?NnjG3}-MEWsrRWS-_4O6fvMDesq6=5NR>;vcH0N5jGPopC93=oJUz4{Um`jdY4tMJG&KCy~5 zJPVnk8PoTH=($NWUod(|A4d!lcw}dKuSo7 zH7o%+QAw?C0?4_bne_C495ph>f#`R&(u%i$D4T>J9|5^!^n3&4gh74;qF>fau0Mh3 zpCGru;PoUW$a)}mK@Z&tvK`17e}_?K`qJXoFHN2IKxUumji-Pp6N2bz0-?WXhYLXT zsffrt4}`?xn(``c^?PcOc@M~GQ`Q9_@_t$E`4W(mrZ+AFId2dUm=_iUax?C*s?pYf znUh>2L(B{1QF5Tl44cH@SW#CVObvr5?479)WGKxQ#oBKmAMtqHAgcsU2uU2 zh$G#(^F2lVL!G%NpQB=tJ5!+DeOncMfaSGvI~hX zYK(N$x!IYjG&xX6-$GSnVyIW|f)1GuK%$iik7>))=`9r&DpDzooparKwq@Ic&W9Dj zd5Bu(>k`6~R3!ry<`zI{9}+-yn+7e32~|`>BbT^l2D12pyn``MVs=y~WakD+&y~j} zXsa<*0e61-(cZmO0)8@$GDJ|n3rY~r;{%bde9YpQ6*_kh(qb-8Wfn*%4}!^=6syc) z?!G#2lItyy?`Q3X>-1c^(oS=7QUf7l1~b$L-~nJzWO`7B3SSJc^p3AM)g*odLU+A+ z$2%2Q8X^8|*Ukg? zg?^AEi`3t;lPX-35JWNYP_ElG!Sku$x-e$;Q@HG9^I(7@^Y&82YwfC@#Mx&A%QhIc z69IoY*CuHycW2UeYN(p+PPz&01n(7Dz3-uHWJ)hvNYU$VXW@bLzS*D28X>jX>Z)KZ zYc%wFY9y$wMYX&ORFR(1GuuNDpd&sFo-7xC0!^B0b!xS23$<>pmd*2}<=)2OgHrb& z*i+s;KI-;Oj2L84C-<&NAO zS4W;qU3Z#{?kSm3fU0gfI&L;=gBw5J%rxYIFU&u-bUJmEu|AnN=#Yf!pX_cB@#ENy z%?m{Ok)XdgLQ|I8=${~alB2pRW{3uR3^$0_4A8>f(SyIZj0orvs2 z`GQ9!FU#%lr{{DQ?dRBjaW1i(e>NC%(UYE#Yp!3{LxP+UIFEnI=JQ;CHpkE?Q0jY< zrd{gkjo0kYb*$5jVKCy7>z`KAeA7e8kOfY9f;LTlVh&j*Wl74YGmYP%@QL-FYcwm< zyxdu9RIhRv`^$RMduZ`LaV*l+P0|L7;r{ezdmXwEqXj$15aoj`#`F`N>iptT&g~Ug z>58lS^=FKl@X&qIuz8&KfZqJ%aiGf$-pW2tmn|%du~WlNC!9uUX?5Y~|Cr zg^8_7XcR%n{$SELzpk{2@SYJTR(`xHJ2bxtYi+cPa%)8#wlD*6fYm`=$qRTJl|VrM E0liQ#il_-en=X(WWGxq2fl)^o#WbT{ z49>A#3Zh@%RAl_oc%>o0u}(GWm?F%bUWyD(#+a~N4VoouLVO$iTc9ZhCM&npXBc&- z<(gULSV+_>W94*KJXpSb&6LoIWo^Y;4KB-e`o-9CjApDDBid#$Z7}96924VAKR65Q)+xOuM>5q#`J*%hwVb|sv$KLtT-dWLwA6&KVq6b!Ze|P%nIWO=0?C+nc zI2*cWbd&$40eAeh`PGlT_hj>1?;eWmDxJS+M{wrqe+pf{3;6L(!(W+(Gy`Z9&Zz|o zH}G7ejm!=Djzxg-p*;K#c{r7aqj`959^RaXAI`(i<>ANj@I86>L-=SG`fJ9V*SHqA zW~TEWN-0*vKJZQ~46egcQ6&Bh-in2Kmw~xvR~s9l6szYE;6FhAI-~t%*bi3#pp=M@ zv%dpAT)`cr<2S$$!XDSoMWR^Lp?wt``y(*zy_DDg2HPA!D~J7`My(K=ne#?_!tdYF6p#56N}xsY`-MLeizve12!^JH z)&Q%4Xyo3I@ZY-Izdp1hl2Ae|E24o!B9su@1BuY0Dt|E45D$j@y93c=$h<~HMgx>9 zx$B1P_Gr9e=LFeMj7lcR>X#1nd!!{+!z}_VhD$Q|Vcdt5@Y}3q0fX#ks3obo#z105|^}s7;c{f%}2&fAPl^I7$2*>ki9R zmc+~mc50z`&$w0=iD0Kr5}z1Yxs>e=@uh*M$@T)_gj>{6BC%bR>TZf6Yzp2Ff^eOD z2)OV{A%@8zlOe|q_cS?fVx#0#1o_FZ;ULFh?<4PL7-5407CH z+~hD=PL3Px9CCO*j~q9P3i4TamLbR9UqX%>;ZkzkfNIEbqgzRiy}g>;EkqqTw&*%? zL}nv7_U>kK7tTEL5+Syc;{frg?`}w)c4ROjvE@MbVVKqqjb^ji_Ww{OW!B-Lg+Wxd^lQRKLW0dI(M~OR$w*iC8f_dGvA@fVr4|M+) zAxxbv*?;T@Y)Wp`QeVRH_D-c(OL1VTqdfDExT2-#X8H)nojz2A|JT0Jbq$|)Ep?(~%iUYMxvnxETsY8un>1gh9V&x7mes{t z>I`e0%7tlpO)V?W_NPviZQ0tb%_#3ah`t%xy7NF+3HrK@dY$v;?wR~NI%T(ZFI~6q zQ`hlM*YP%6-Fv(Man0-OWe?F);}G)7cQ;{K&y#AftY5|>n3i;E_Z4ZrGS|`N4z0eV z!=~9&V>V@Pq9VQYX3blodWWmex!P{Wu67+SO!e3pmy>_VX4^Vj--E@jA-m=q?y!$+ zNR8QDZEwL`YOFw+QrVe0F>lM={;k~;^c+U}xSod$J>|DRhtr;V$)@^-M;>I4`VzHX zT7F?dkL@|j{c3+|sG@5OUJpBMsVv()6s&A!`hBnM3V|D!D0SSM(Gkj~p~g{-pKRI4L0K&Yb+IIR7~LOK;id zLj1MAn+}&-tW)~InlnBsdC~< zFu|O&rE<>X#1GzBKj3QPb5QyYo9lSBIyU=D80gB_u?AFMUuF_^j8;F`p+|o(^?pIu z`wq?5H{#S7ph5MwH~OGq1f9~iLPM$Q!vxG8rIInn1!Jz`W9rg!wf>dNu|G5HgB@5) zgIERHef_ETU0v^EnqGku%KZ$jcMy|2yHj>9%ystlvH#!5{(T*GL}sx37PS|VF`V3H zG%dHKm)lkEpjPYTcE$g(QmA*eUxN7cEVoZdy;K07duwIL<*|lQzGO}zCo@fCzr0Z=gA!88A2!A zrW3um$7-pE;Hf;pSW#D&m!wm}I73h?>RnmxWIVtf98mfQ&uF!(JhKOeRCwt&&b5gv zE=I*ZXF53qS=Bd?x%YEU@Ia4U;JB&md;u}fe)7!O*HWi!s#0F0ZY+1Ib>-N-Me=+Z z%Vy0W!{>>|Rw;C+lPBp!8Jxf=*8^i;rxhOLDV_>9)LvMGC8uqSwwiItHU`lihh3O^ z+%%foLO;RN3}mo}+d5rs9SB0@XPR~zqe$O3tll?}KK4FCc3=NUX@{dYeXk8CrR(VA zwob*XezA0R@`GOQu$uwA*QR*~5L&0^?FVyk1NdH1>-#d3Ip{H)=6gk}?^7=CaTL!s zl_ZbZUhOFqYM&Vto^mu(F!G4*h5G8qo4V8H+>YS6=mq}hPaiuC*Ra<9^d#?Xu#!c< z^ldItuc!?~6OFw!j*x!Y9DSXs>u1n~(T5%{gFf65Dm%F__#BG(I{!A!bW9@>-V>aJ+aT5BeMh8vZR%cVJjTc(G?^cv0bPow zT|*B}$mxUtHUIoGh+rluwuM$OiNm1<7t_b&)u|J8a)`a&fy()dJ-yz+3QvWnvDbUD zQmALsz5&&DV&qWfZ?UQ6zQ7tgaQZHIZI1bAJc41&TC#|TVf%@P~;tS{aX6o*wyE3 zRK0JQQ=v(HT#TAD#vV7IhiO!k-n1@AowD!WdvkV*Yvt#h5*or}IpuE3b-V*USC8r5 zDl>BmRq1}_Pf)A3o%$~vil!QRB9E8UXZpco@kBtO-UT7;l|#bH6Y2H=21bv36Y^^qgn&-;5e zdB%M1wEUjw$2*_QD0JV6-!7Cl%gs=6OVz?fiTBj)`<=P-uJc@9Q8|CXYA9Z| ze8oy{?W)ylZoRFpe(mk+?pVKJqi@r9H{bca!1jhHT?rJ_6?>a6SU(BXB+f=Ogg{DFS>7 z;do8X`a}5k#AiyrC&#N^@t@#)X5}|6yaJZr!W`td{^_}Fd>tOY@k(0k#lJ%EBD?|O z&!-uC-6qqrmw28mF%ROW}8Sv-}Wa`zh!d&~ebKpf^DufzE-7F`z3z9?;F8wV=B}G0^>> zAA)`gdIoeH^eX60&_|$ipkf4q-vm~zSaE}Uj&FN1rX<}}o+{6R>#C9xExcC8u#wo) zqy)BuD=j(?o3$9e26=YGlAi6!NHlmI9_J(q2NGf73GRuZr_PlYy=8Z(B@v0oCICO$ zT0&9E>y_rHB0Tb=n@0(?qAowZd0OJ~tBxlW_BXZ!nnJ?Upu}4eFrc&VH$V|Zq_&p0 zv>a%PG{9OMTJX;!RqJZ-Z3r6TO--SgVut;%a()NLbjx*f2AqUYB{l}nJ3W|8B06?BjLj;7o=evdls z)4%{PhDow+(Nu-0&vQ(kaKR$GB#U? zXAu;xnS~&Zp#+3wIYHl3bMXz1<0_m&XWVVG901luMIPeS2;O@eobX1_>O19!rIo+);Fkyr=(dow=3JAlpSDC%R5<6)^! z&-G~qHVape25ikeIs|OZUHS>IHFt@*T<((b+@cqN&EiI-FAtxzVA?wiY|W)Av>YC6 zpPq;309$jtJbCRa^6(~LYwlDmuYEtTH5W<)w&p(l4A`1Wbp+U&OV$N!&E5KUU~4Yf zJHTe)c>a=yi*Yu|YzMS4*X%N2Yi?JiaduG$`_}^>u3!-L`Sazq@5saVNO|2T_3s6? z=Bjn%$v**X_2(Cs_F1sn18mK$dlT52OD7sy6uj$fZ1gnXo#u*-w==zJ!$xL}`BzRr zx2~`>F;OZS-yVqi<+H0lkZeV!Q&V#^q=bT=#TD}_1snX4U@OrAAs=}C!DLg@9@CC@ z?Mi8;cKxz?uir#8W7fy5$OmQJik{mAcV#6K+u^CKT3jg_^eiu2mlfms5)q6>n*xy- zu17rc7ga7o?o}cgRajprn)c}VS{(eUy4#m8tMlJpTf4!#(Z6xo@;Wbr5KP4V;Xo`H zMY5b85z{+lwOMku{AP|=WYLmE9%PaEn;ZN}I2qgN+1@JrEAL#ptbWakT;`dP7FJVZ zrg2r|QphYxXcIE=^z1ma8hLLMbNs$0kuNX1ZQR!4{A4<&rG;C@1uA5QnicEWgSoUe zYZE#%1&BACI4(&q ZbIE|#%*}BT=Kopat&d$#xzsa1{|8+){`&v` literal 0 HcmV?d00001 diff --git a/plugin/python.vim b/plugin/python.vim new file mode 100644 index 00000000..55f8576b --- /dev/null +++ b/plugin/python.vim @@ -0,0 +1,294 @@ +"============================================================================= +" +" FileName: python.vim +" Desc: 修改了缩进的bug +" +" Author: dantezhu - http://www.vimer.cn +" Email: zny2008@gmail.com +" +" Created: 2011-02-21 23:55:50 +" Version: 0.0.9 +" History: +" 0.0.9 | dantezhu | 2011-03-15 10:15:05 | 注释和string不缩进 +" 0.0.8 | dantezhu | 2011-03-10 18:41:15 | 之前修正的有点问题 +" 0.0.7 | dantezhu | 2011-03-10 11:06:01 | 向cindent看齐,函数名 +" | 太短则和匹配的地方对齐 +" 0.0.6 | dantezhu | 2011-02-26 23:45:18 | 只约束是字母太弱了, +" | 还有数字和下划线 +" 0.0.5 | dantezhu | 2011-02-26 23:28:16 | 修正对调用函数时,多 +" | 行参数的)的缩进 +" 0.0.4 | dantezhu | 2011-02-24 19:32:14 | 之前的fix有问题,重写 +" 0.0.3 | dantezhu | 2011-02-22 14:53:40 | 修正了Comment或者 +" | String中存在:时就会缩 +" | 进的问题 +" 0.0.2 | dantezhu | 2011-02-22 01:15:53 | 增加了对class,if,elif +" | 等的兼容 +" 0.0.1 | dantezhu | 2011-02-21 23:55:50 | initialization +" +"============================================================================= + +" Python indent file +" Language: Python +" Maintainer: Eric Mc Sween +" Original Author: David Bustos +" Last Change: 2004 Jun 07 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal expandtab +setlocal nolisp +setlocal autoindent +setlocal indentexpr=GetPythonIndent(v:lnum) +setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except + +let s:maxoff = 50 + +" Find backwards the closest open parenthesis/bracket/brace. +function! s:SearchParensPair() + let line = line('.') + let col = col('.') + + " Skip strings and comments and don't look too far + let skip = "line('.') < " . (line - s:maxoff) . " ? dummy :" . + \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? ' . + \ '"string\\|comment"' + + " Search for parentheses + call cursor(line, col) + let parlnum = searchpair('(', '', ')', 'bW', skip) + let parcol = col('.') + + " Search for brackets + call cursor(line, col) + let par2lnum = searchpair('\[', '', '\]', 'bW', skip) + let par2col = col('.') + + " Search for braces + call cursor(line, col) + let par3lnum = searchpair('{', '', '}', 'bW', skip) + let par3col = col('.') + + " Get the closest match + if par2lnum > parlnum || (par2lnum == parlnum && par2col > parcol) + let parlnum = par2lnum + let parcol = par2col + endif + if par3lnum > parlnum || (par3lnum == parlnum && par3col > parcol) + let parlnum = par3lnum + let parcol = par3col + endif + + " Put the cursor on the match + if parlnum > 0 + call cursor(parlnum, parcol) + endif + return parlnum +endfunction + +" Find the start of a multi-line statement +function! s:StatementStart(lnum) + let lnum = a:lnum + while 1 + if getline(lnum - 1) =~ '\\$' + let lnum = lnum - 1 + else + call cursor(lnum, 1) + let maybe_lnum = s:SearchParensPair() + if maybe_lnum < 1 + return lnum + else + let lnum = maybe_lnum + endif + endif + endwhile +endfunction + +" Find the block starter that matches the current line +function! s:BlockStarter(lnum, block_start_re) + let lnum = a:lnum + let maxindent = 10000 " whatever + while lnum > 1 + let lnum = prevnonblank(lnum - 1) + if indent(lnum) < maxindent + if getline(lnum) =~ a:block_start_re + return lnum + else + let maxindent = indent(lnum) + " It's not worth going further if we reached the top level + if maxindent == 0 + return -1 + endif + endif + endif + endwhile + return -1 +endfunction + +function! GetPythonIndent(lnum) + + " First line has indent 0 + if a:lnum == 1 + return 0 + endif + +"Add-Begin by dantezhu in 2011-03-15 10:14:01 +"修正注释和字符串缩进的问题 + " If the start of the line is in a string don't change the indent. + if has('syntax_items') + \ && synIDattr(synID(a:lnum, col('.')-1, 1), 'name') =~ '\(Comment\|String\)$' + return -1 + endif +"Add-End + + " If we can find an open parenthesis/bracket/brace, line up with it. + call cursor(a:lnum, 1) + let parlnum = s:SearchParensPair() + if parlnum > 0 + let parcol = col('.') + let closing_paren = match(getline(a:lnum), '^\s*[])}]') != -1 + if match(getline(parlnum), '[([{]\s*$', parcol - 1) != -1 + if closing_paren + "Mod-Begin by dantezhu in 2011-02-21 23:38:24 + "FROM + "return indent(parlnum) + "TO + "为了支持如下的格式: + "def fun( + " a, + " b + " ): + " print a,b + "又不影响如下格式: + "val = { + " ( + " 1, + " 2 + " ):1 + "} + + "Add-Begin by dantezhu in 2011-02-26 23:23:08 + "增加了对 + "x = user.getdata1_( + " a, + " b, + " c + " ) + "的支持 + if match(getline(parlnum), '\(\a\|\d\|_\)\s*(\s*$', 0) != -1 + "增加了对 + "x( + " 1, + " 2, + " 3 + " ) + "user.login( + " 1, + " 2, + " 3 + " ) + " 的支持 + if (parcol -1 - indent(parlnum)) < 4 + return parcol - 1 + else + return indent(parlnum) + &sw + endif + endif + "Add-End + if match(getline(a:lnum), ')\s*:') != -1 && + \ match(getline(parlnum), '\(def\|class\|if\|elif\|while\)\(\s\+\|(\)') != -1 + return indent(parlnum) + &sw + else + return indent(parlnum) + endif + "Mod-End + else + return indent(parlnum) + &sw + endif + else + if closing_paren + return parcol - 1 + else + return parcol + endif + endif + endif + + " Examine this line + let thisline = getline(a:lnum) + let thisindent = indent(a:lnum) + + " If the line starts with 'elif' or 'else', line up with 'if' or 'elif' + if thisline =~ '^\s*\(elif\|else\)\>' + let bslnum = s:BlockStarter(a:lnum, '^\s*\(if\|elif\)\>') + if bslnum > 0 + return indent(bslnum) + else + return -1 + endif + endif + + " If the line starts with 'except' or 'finally', line up with 'try' + " or 'except' + if thisline =~ '^\s*\(except\|finally\)\>' + let bslnum = s:BlockStarter(a:lnum, '^\s*\(try\|except\)\>') + if bslnum > 0 + return indent(bslnum) + else + return -1 + endif + endif + + " Examine previous line + let plnum = a:lnum - 1 + let pline = getline(plnum) + let sslnum = s:StatementStart(plnum) + + " If the previous line is blank, keep the same indentation + if pline =~ '^\s*$' + return -1 + endif + + " If this line is explicitly joined, try to find an indentation that looks + " good. + if pline =~ '\\$' + let compound_statement = '^\s*\(if\|while\|for\s.*\sin\|except\)\s*' + let maybe_indent = matchend(getline(sslnum), compound_statement) + if maybe_indent != -1 + return maybe_indent + else + return indent(sslnum) + &sw * 2 + endif + endif + + " If the previous line ended with a colon, indent relative to + " statement start. + if pline =~ ':\s*$' + "Mod-Begin by dantezhu in 2011-02-24 19:30:52 + "FROM + "return indent(sslnum) + &sw + "TO + let t_col = match(pline,':\s*$')+1 + if synIDattr(synID(a:lnum-1, t_col, 1), 'name') !~ '\(Comment\|String\)$' + return indent(sslnum) + &sw + endif + "Mod-End + endif + + " If the previous line was a stop-execution statement or a pass + if getline(sslnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>' + " See if the user has already dedented + if indent(a:lnum) > indent(sslnum) - &sw + " If not, recommend one dedent + return indent(sslnum) - &sw + endif + " Otherwise, trust the user + return -1 + endif + + " In all other cases, line up with the start of the previous statement. + return indent(sslnum) + endfunction diff --git a/plugin/python_fn.vim b/plugin/python_fn.vim new file mode 100644 index 00000000..7c7cf21b --- /dev/null +++ b/plugin/python_fn.vim @@ -0,0 +1,446 @@ +" -*- vim -*- +" FILE: python_fn.vim +" LAST MODIFICATION: 2008-08-28 8:19pm +" (C) Copyright 2001-2005 Mikael Berthe +" Maintained by Jon Franklin +" Version: 1.13 + +" USAGE: +" +" Save this file to $VIMFILES/ftplugin/python.vim. You can have multiple +" python ftplugins by creating $VIMFILES/ftplugin/python and saving your +" ftplugins in that directory. If saving this to the global ftplugin +" directory, this is the recommended method, since vim ships with an +" ftplugin/python.vim file already. +" You can set the global variable "g:py_select_leading_comments" to 0 +" if you don't want to select comments preceding a declaration (these +" are usually the description of the function/class). +" You can set the global variable "g:py_select_trailing_comments" to 0 +" if you don't want to select comments at the end of a function/class. +" If these variables are not defined, both leading and trailing comments +" are selected. +" Example: (in your .vimrc) "let g:py_select_leading_comments = 0" +" You may want to take a look at the 'shiftwidth' option for the +" shift commands... +" +" REQUIREMENTS: +" vim (>= 7) +" +" Shortcuts: +" ]t -- Jump to beginning of block +" ]e -- Jump to end of block +" ]v -- Select (Visual Line Mode) block +" ]< -- Shift block to left +" ]> -- Shift block to right +" ]# -- Comment selection +" ]u -- Uncomment selection +" ]c -- Select current/previous class +" ]d -- Select current/previous function +" ] -- Jump to previous line with the same/lower indentation +" ] -- Jump to next line with the same/lower indentation + +" Only do this when not done yet for this buffer +if exists("b:loaded_py_ftplugin") + finish +endif +let b:loaded_py_ftplugin = 1 + +map ]t :PBoB +vmap ]t :PBOBm'gv`` +map ]e :PEoB +vmap ]e :PEoBm'gv`` + +map ]v ]tV]e +map ]< ]tV]e< +vmap ]< < +map ]> ]tV]e> +vmap ]> > + +map ]# :call PythonCommentSelection() +vmap ]# :call PythonCommentSelection() +map ]u :call PythonUncommentSelection() +vmap ]u :call PythonUncommentSelection() + +map ]c :call PythonSelectObject("class") +map ]d :call PythonSelectObject("function") + +map ] :call PythonNextLine(-1) +map ] :call PythonNextLine(1) +" You may prefer use and ... :-) + +" jump to previous class +map ]J :call PythonDec("class", -1) +vmap ]J :call PythonDec("class", -1) + +" jump to next class +map ]j :call PythonDec("class", 1) +vmap ]j :call PythonDec("class", 1) + +" jump to previous function +map ]F :call PythonDec("function", -1) +vmap ]F :call PythonDec("function", -1) + +" jump to next function +map ]f :call PythonDec("function", 1) +vmap ]f :call PythonDec("function", 1) + + + +" Menu entries +nmenu &Python.Update\ IM-Python\ Menu + \:call UpdateMenu() +nmenu &Python.-Sep1- : +nmenu &Python.Beginning\ of\ Block[t + \]t +nmenu &Python.End\ of\ Block]e + \]e +nmenu &Python.-Sep2- : +nmenu &Python.Shift\ Block\ Left]< + \]< +vmenu &Python.Shift\ Block\ Left]< + \]< +nmenu &Python.Shift\ Block\ Right]> + \]> +vmenu &Python.Shift\ Block\ Right]> + \]> +nmenu &Python.-Sep3- : +vmenu &Python.Comment\ Selection]# + \]# +nmenu &Python.Comment\ Selection]# + \]# +vmenu &Python.Uncomment\ Selection]u + \]u +nmenu &Python.Uncomment\ Selection]u + \]u +nmenu &Python.-Sep4- : +nmenu &Python.Previous\ Class]J + \]J +nmenu &Python.Next\ Class]j + \]j +nmenu &Python.Previous\ Function]F + \]F +nmenu &Python.Next\ Function]f + \]f +nmenu &Python.-Sep5- : +nmenu &Python.Select\ Block]v + \]v +nmenu &Python.Select\ Function]d + \]d +nmenu &Python.Select\ Class]c + \]c +nmenu &Python.-Sep6- : +nmenu &Python.Previous\ Line\ wrt\ indent] + \] +nmenu &Python.Next\ Line\ wrt\ indent] + \] + +:com! PBoB execute "normal ".PythonBoB(line('.'), -1, 1)."G" +:com! PEoB execute "normal ".PythonBoB(line('.'), 1, 1)."G" +:com! UpdateMenu call UpdateMenu() + + +" Go to a block boundary (-1: previous, 1: next) +" If force_sel_comments is true, 'g:py_select_trailing_comments' is ignored +function! PythonBoB(line, direction, force_sel_comments) + let ln = a:line + let ind = indent(ln) + let mark = ln + let indent_valid = strlen(getline(ln)) + let ln = ln + a:direction + if (a:direction == 1) && (!a:force_sel_comments) && + \ exists("g:py_select_trailing_comments") && + \ (!g:py_select_trailing_comments) + let sel_comments = 0 + else + let sel_comments = 1 + endif + + while((ln >= 1) && (ln <= line('$'))) + if (sel_comments) || (match(getline(ln), "^\\s*#") == -1) + if (!indent_valid) + let indent_valid = strlen(getline(ln)) + let ind = indent(ln) + let mark = ln + else + if (strlen(getline(ln))) + if (indent(ln) < ind) + break + endif + let mark = ln + endif + endif + endif + let ln = ln + a:direction + endwhile + + return mark +endfunction + + +" Go to previous (-1) or next (1) class/function definition +function! PythonDec(obj, direction) + if (a:obj == "class") + let objregexp = "^\\s*class\\s\\+[a-zA-Z0-9_]\\+" + \ . "\\s*\\((\\([a-zA-Z0-9_,. \\t\\n]\\)*)\\)\\=\\s*:" + else + let objregexp = "^\\s*def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\_[^:#]*)\\s*:" + endif + let flag = "W" + if (a:direction == -1) + let flag = flag."b" + endif + let res = search(objregexp, flag) +endfunction + + +" Comment out selected lines +" commentString is inserted in non-empty lines, and should be aligned with +" the block +function! PythonCommentSelection() range + let commentString = "#" + let cl = a:firstline + let ind = 1000 " I hope nobody use so long lines! :) + + " Look for smallest indent + while (cl <= a:lastline) + if strlen(getline(cl)) + let cind = indent(cl) + let ind = ((ind < cind) ? ind : cind) + endif + let cl = cl + 1 + endwhile + if (ind == 1000) + let ind = 1 + else + let ind = ind + 1 + endif + + let cl = a:firstline + execute ":".cl + " Insert commentString in each non-empty line, in column ind + while (cl <= a:lastline) + if strlen(getline(cl)) + execute "normal ".ind."|i".commentString + endif + execute "normal \" + let cl = cl + 1 + endwhile +endfunction + +" Uncomment selected lines +function! PythonUncommentSelection() range + " commentString could be different than the one from CommentSelection() + " For example, this could be "# \\=" + let commentString = "#" + let cl = a:firstline + while (cl <= a:lastline) + let ul = substitute(getline(cl), + \"\\(\\s*\\)".commentString."\\(.*\\)$", "\\1\\2", "") + call setline(cl, ul) + let cl = cl + 1 + endwhile +endfunction + + +" Select an object ("class"/"function") +function! PythonSelectObject(obj) + " Go to the object declaration + normal $ + call PythonDec(a:obj, -1) + let beg = line('.') + + if !exists("g:py_select_leading_comments") || (g:py_select_leading_comments) + let decind = indent(beg) + let cl = beg + while (cl>1) + let cl = cl - 1 + if (indent(cl) == decind) && (getline(cl)[decind] == "#") + let beg = cl + else + break + endif + endwhile + endif + + if (a:obj == "class") + let eod = "\\(^\\s*class\\s\\+[a-zA-Z0-9_]\\+\\s*" + \ . "\\((\\([a-zA-Z0-9_,. \\t\\n]\\)*)\\)\\=\\s*\\)\\@<=:" + else + let eod = "\\(^\\s*def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\_[^:#]*)\\s*\\)\\@<=:" + endif + " Look for the end of the declaration (not always the same line!) + call search(eod, "") + + " Is it a one-line definition? + if match(getline('.'), "^\\s*\\(#.*\\)\\=$", col('.')) == -1 + let cl = line('.') + execute ":".beg + execute "normal V".cl."G" + else + " Select the whole block + execute "normal \" + let cl = line('.') + execute ":".beg + execute "normal V".PythonBoB(cl, 1, 0)."G" + endif +endfunction + + +" Jump to the next line with the same (or lower) indentation +" Useful for moving between "if" and "else", for example. +function! PythonNextLine(direction) + let ln = line('.') + let ind = indent(ln) + let indent_valid = strlen(getline(ln)) + let ln = ln + a:direction + + while((ln >= 1) && (ln <= line('$'))) + if (!indent_valid) && strlen(getline(ln)) + break + else + if (strlen(getline(ln))) + if (indent(ln) <= ind) + break + endif + endif + endif + let ln = ln + a:direction + endwhile + + execute "normal ".ln."G" +endfunction + +function! UpdateMenu() + " delete menu if it already exists, then rebuild it. + " this is necessary in case you've got multiple buffers open + " a future enhancement to this would be to make the menu aware of + " all buffers currently open, and group classes and functions by buffer + if exists("g:menuran") + aunmenu IM-Python + endif + let restore_fe = &foldenable + set nofoldenable + " preserve disposition of window and cursor + let cline=line('.') + let ccol=col('.') - 1 + norm H + let hline=line('.') + " create the menu + call MenuBuilder() + " restore disposition of window and cursor + exe "norm ".hline."Gzt" + let dnscroll=cline-hline + exe "norm ".dnscroll."j".ccol."l" + let &foldenable = restore_fe +endfunction + +function! MenuBuilder() + norm gg0 + let currentclass = -1 + let classlist = [] + let parentclass = "" + while line(".") < line("$") + " search for a class or function + if match ( getline("."), '^\s*class\s\+[_a-zA-Z].*\|^\s*def\s\+[_a-zA-Z].*' ) != -1 + norm ^ + let linenum = line('.') + let indentcol = col('.') + norm "nye + let classordef=@n + norm w"nywge + let objname=@n + let parentclass = FindParentClass(classlist, indentcol) + if classordef == "class" + call AddClass(objname, linenum, parentclass) + else " this is a function + call AddFunction(objname, linenum, parentclass) + endif + " We actually created a menu, so lets set the global variable + let g:menuran=1 + call RebuildClassList(classlist, [objname, indentcol], classordef) + endif " line matched + norm j + endwhile +endfunction + +" classlist contains the list of nested classes we are in. +" in most cases it will be empty or contain a single class +" but where a class is nested within another, it will contain 2 or more +" this function adds or removes classes from the list based on indentation +function! RebuildClassList(classlist, newclass, classordef) + let i = len(a:classlist) - 1 + while i > -1 + if a:newclass[1] <= a:classlist[i][1] + call remove(a:classlist, i) + endif + let i = i - 1 + endwhile + if a:classordef == "class" + call add(a:classlist, a:newclass) + endif +endfunction + +" we found a class or function, determine its parent class based on +" indentation and what's contained in classlist +function! FindParentClass(classlist, indentcol) + let i = 0 + let parentclass = "" + while i < len(a:classlist) + if a:indentcol <= a:classlist[i][1] + break + else + if len(parentclass) == 0 + let parentclass = a:classlist[i][0] + else + let parentclass = parentclass.'\.'.a:classlist[i][0] + endif + endif + let i = i + 1 + endwhile + return parentclass +endfunction + +" add a class to the menu +function! AddClass(classname, lineno, parentclass) + if len(a:parentclass) > 0 + let classstring = a:parentclass.'\.'.a:classname + else + let classstring = a:classname + endif + exe 'menu IM-Python.classes.'.classstring.' :call JumpToAndUnfold('.a:lineno.')' +endfunction + +" add a function to the menu, grouped by member class +function! AddFunction(functionname, lineno, parentclass) + if len(a:parentclass) > 0 + let funcstring = a:parentclass.'.'.a:functionname + else + let funcstring = a:functionname + endif + exe 'menu IM-Python.functions.'.funcstring.' :call JumpToAndUnfold('.a:lineno.')' +endfunction + + +function! s:JumpToAndUnfold(line) + " Go to the right line + execute 'normal '.a:line.'gg' + " Check to see if we are in a fold + let lvl = foldlevel(a:line) + if lvl != 0 + " and if so, then expand the fold out, other wise, ignore this part. + execute 'normal 15zo' + endif +endfunction + +"" This one will work only on vim 6.2 because of the try/catch expressions. +" function! s:JumpToAndUnfoldWithExceptions(line) +" try +" execute 'normal '.a:line.'gg15zo' +" catch /^Vim\((\a\+)\)\=:E490:/ +" " Do nothing, just consume the error +" endtry +"endfunction + + +" vim:set et sts=2 sw=2: + diff --git a/plugin/supertab.vim b/plugin/supertab.vim new file mode 100644 index 00000000..07351a79 --- /dev/null +++ b/plugin/supertab.vim @@ -0,0 +1,211 @@ +" Author: Gergely Kontra +" You may direct issues regarding version 0.4+ to +" Eric Van Dewoestine (ervandew@yahoo.com). +" Version: 0.41 +" Description: +" Use your tab key to do all your completion in insert mode! +" The script remembers the last completion type, and applies that. +" Eg.: You want to enter /usr/local/lib/povray3/ +" You type (in insert mode): +" /u/l/p/i +" You can also manipulate the completion type used by changing g:complType +" variable. +" You can cycle forward and backward with the and keys +" ( will not work in the console version) +" Note: you must press once to be able to cycle back +" History: +" 0.41 Fixed couple bugs introduced in last version (Eric Van Dewoestine). +" 0.4 Added the following functionality (Eric Van Dewoestine) +" - support for vim 7 omni, user, and spelling completion modes +" (should be backwards compatible with vim 6.x). +" - command :SuperTabHelp which opens a window with available +" completion types that the user can choose from. +" - variable g:SuperTabRetainCompletionType setting for determining if +" and for how long to retain completion type. +" 0.32 Corrected tab-insertion/completing decidion (thx to: Lorenz Wegener) +" 0.31 Added for backward cycling. (req by: Peter Chun) +" 0.3 Back to the roots. Autocompletion is another story... +" Now the prompt appears, when showmode is on + +if !exists('complType') "Integration with other completion functions... + + " This variable determines if, and for how long, the current completion type + " is retained. The possible values include: + " 0 - The current completion type is only retained for the current completion. + " Once you have chosen a completion result or exited the completion + " mode, the default completion type is restored. + " 1 - The current completion type is saved for the duration of your vim + " session or until you enter a different completion mode. + " (SuperTab default). + " 2 - The current completion type is saved until you exit insert mode (via + " ESC). Once you exit insert mode the default completion type is + " restored. + if !exists("g:SuperTabRetainCompletionType") + let g:SuperTabRetainCompletionType = 1 + endif + + " This variable is used to set the default completion type. + " There is no need to escape this value as that will be done for you when + " the type is set. + " Ex. let g:SuperTabDefaultCompletionType = "" + if !exists("g:SuperTabDefaultCompletionType") + let g:SuperTabDefaultCompletionType = "" + endif + + " construct the help text. + let s:tabHelp = + \ "Hit or CTRL-] on the completion type you wish to swith to.\n" . + \ "Use :help ins-completion for more information.\n" . + \ "\n" . + \ "|| - Keywords in 'complete' searching down.\n" . + \ "|| - Keywords in 'complete' searching up (SuperTab default).\n" . + \ "|| - Whole lines.\n" . + \ "|| - Keywords in current file.\n" . + \ "|| - Keywords in 'dictionary'.\n" . + \ "|| - Keywords in 'thesaurus', thesaurus-style.\n" . + \ "|| - Keywords in the current and included files.\n" . + \ "|| - Tags.\n" . + \ "|| - File names.\n" . + \ "|| - Definitions or macros.\n" . + \ "|| - Vim command-line." + if v:version >= 700 + let s:tabHelp = s:tabHelp . "\n" . + \ "|| - User defined completion.\n" . + \ "|| - Occult completion.\n" . + \ "|s| - Spelling suggestions." + endif + + " set the available completion types and modes. + let s:types = + \ "\\\\\\\\\\\\\" + let s:modes = '/^E/^Y/^L/^N/^K/^T/^I/^]/^F/^D/^V/^P' + if v:version >= 700 + let s:types = s:types . "\\\\s" + let s:modes = s:modes . '/^U/^O/s' + endif + let s:types = s:types . "np" + let s:modes = s:modes . '/n/p' + + " Globally available function that user's can use to create mappings to + " quickly switch completion modes. Useful when a user wants to restore the + " default or switch to another mode without having to kick off a completion + " of that type or use SuperTabHelp. + " Example mapping to restore SuperTab default: + " nmap :call SetSuperTabCompletionType("") + fu! SuperTabSetCompletionType (type) + exec "let g:complType = \"" . escape(a:type, '<') . "\"" + endf + + call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) + + im =CtrlXPP() + + " Setup mechanism to restore orignial completion type upon leaving insert + " mode if g:SuperTabDefaultCompletionType == 2 + if g:SuperTabRetainCompletionType == 2 + " pre vim 7, must map + if v:version < 700 + im + \ :call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) + + " since vim 7, we can use InsertLeave autocmd. + else + augroup supertab + autocmd InsertLeave * + \ call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) + augroup END + endif + endif + + fu! CtrlXPP() + if &smd + echo '' | echo '-- ^X++ mode (' . s:modes . ')' + endif + let complType=nr2char(getchar()) + if stridx(s:types, complType) != -1 + if stridx("\\",complType)!=-1 " no memory, just scroll... + return "\".complType + elseif stridx('np',complType)!=-1 + let complType=nr2char(char2nr(complType)-96) " char2nr('n')-char2nr("\ + inore + + " This way after hitting , hitting it once more will go to next match + " (because in XIM mode and mappings are ignored) + " and wont start a brand new completion + " The side effect, that in the beginning of line and inserts a + " , but I hope it may not be a problem... + ino =SuperTab('n') + ino =SuperTab('p') + + fu! SuperTab(command) + if (strpart(getline('.'),col('.')-2,1)=~'^\s\?$') + return "\" + else + " exception: if in mode, then should move up the list, and + " down the list. + if a:command == 'p' && g:complType == "\" + return "\" + endif + return g:complType + endif + endf + + fu! SuperTabHelp() + if bufwinnr("SuperTabHelp") == -1 + botright split SuperTabHelp + + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + + let saved = @" + let @" = s:tabHelp + silent put + call cursor(1,1) + silent 1,delete + call cursor(4,1) + let @" = saved + exec "resize " . line('$') + + syntax match Special "|.\{-}|" + + setlocal readonly + setlocal nomodifiable + + nmap :call SetCompletionType() + nmap :call SetCompletionType() + else + exec bufwinnr("SuperTabHelp") . "winc w" + endif + endf + + fu! s:SetCompletionType () + let chosen = substitute(getline('.'), '.*|\(.*\)|.*', '\1', '') + if chosen != getline('.') + call SuperTabSetCompletionType(chosen) + close + winc p + endif + endf + + if !exists(":SuperTabHelp") + command SuperTabHelp :call SuperTabHelp() + endif +en diff --git a/plugin/taglist.vim b/plugin/taglist.vim new file mode 100644 index 00000000..59901f64 --- /dev/null +++ b/plugin/taglist.vim @@ -0,0 +1,4546 @@ +" File: taglist.vim +" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +" Version: 4.5 +" Last Modified: September 21, 2007 +" Copyright: Copyright (C) 2002-2007 Yegappan Lakshmanan +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" taglist.vim is provided *as is* and comes with no warranty of any +" kind, either expressed or implied. In no event will the copyright +" holder be liable for any damamges resulting from the use of this +" software. +" +" The "Tag List" plugin is a source code browser plugin for Vim and provides +" an overview of the structure of the programming language files and allows +" you to efficiently browse through source code files for different +" programming languages. You can visit the taglist plugin home page for more +" information: +" +" http://vim-taglist.sourceforge.net +" +" You can subscribe to the taglist mailing list to post your questions +" or suggestions for improvement or to report bugs. Visit the following +" page for subscribing to the mailing list: +" +" http://groups.yahoo.com/group/taglist/ +" +" For more information about using this plugin, after installing the +" taglist plugin, use the ":help taglist" command. +" +" Installation +" ------------ +" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim +" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should +" unzip the following two files (the directory structure should be +" preserved): +" +" plugin/taglist.vim - main taglist plugin file +" doc/taglist.txt - documentation (help) file +" +" Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath' +" Vim help pages for more details about installing Vim plugins. +" 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or +" $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." +" command to process the taglist help file. +" 3. If the exuberant ctags utility is not present in your PATH, then set the +" Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags +" utility (not to the directory) in the .vimrc file. +" 4. If you are running a terminal/console version of Vim and the +" terminal doesn't support changing the window width then set the +" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. +" 5. Restart Vim. +" 6. You can now use the ":TlistToggle" command to open/close the taglist +" window. You can use the ":help taglist" command to get more +" information about using the taglist plugin. +" +" ****************** Do not modify after this line ************************ + +" Line continuation used here +let s:cpo_save = &cpo +set cpo&vim + +if !exists('loaded_taglist') + " First time loading the taglist plugin + " + " To speed up the loading of Vim, the taglist plugin uses autoload + " mechanism to load the taglist functions. + " Only define the configuration variables, user commands and some + " auto-commands and finish sourcing the file + + " The taglist plugin requires the built-in Vim system() function. If this + " function is not available, then don't load the plugin. + if !exists('*system') + echomsg 'Taglist: Vim system() built-in function is not available. ' . + \ 'Plugin is not loaded.' + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + + " Location of the exuberant ctags tool + if !exists('Tlist_Ctags_Cmd') + if executable('exuberant-ctags') + " On Debian Linux, exuberant ctags is installed + " as exuberant-ctags + let Tlist_Ctags_Cmd = 'exuberant-ctags' + elseif executable('exctags') + " On Free-BSD, exuberant ctags is installed as exctags + let Tlist_Ctags_Cmd = 'exctags' + elseif executable('ctags') + let Tlist_Ctags_Cmd = 'ctags' + elseif executable('ctags.exe') + let Tlist_Ctags_Cmd = 'ctags.exe' + elseif executable('tags') + let Tlist_Ctags_Cmd = 'tags' + else + echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . + \ 'not found in PATH. Plugin is not loaded.' + " Skip loading the plugin + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + endif + + + " Automatically open the taglist window on Vim startup + if !exists('Tlist_Auto_Open') + let Tlist_Auto_Open = 0 + endif + + " When the taglist window is toggle opened, move the cursor to the + " taglist window + if !exists('Tlist_GainFocus_On_ToggleOpen') + let Tlist_GainFocus_On_ToggleOpen = 0 + endif + + " Process files even when the taglist window is not open + if !exists('Tlist_Process_File_Always') + let Tlist_Process_File_Always = 0 + endif + + if !exists('Tlist_Show_Menu') + let Tlist_Show_Menu = 0 + endif + + " Tag listing sort type - 'name' or 'order' + if !exists('Tlist_Sort_Type') + let Tlist_Sort_Type = 'order' + endif + + " Tag listing window split (horizontal/vertical) control + if !exists('Tlist_Use_Horiz_Window') + let Tlist_Use_Horiz_Window = 0 + endif + + " Open the vertically split taglist window on the left or on the right + " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to + " zero (i.e. only for vertically split windows) + if !exists('Tlist_Use_Right_Window') + let Tlist_Use_Right_Window = 0 + endif + + " Increase Vim window width to display vertically split taglist window. + " For MS-Windows version of Vim running in a MS-DOS window, this must be + " set to 0 otherwise the system may hang due to a Vim limitation. + if !exists('Tlist_Inc_Winwidth') + if (has('win16') || has('win95')) && !has('gui_running') + let Tlist_Inc_Winwidth = 0 + else + let Tlist_Inc_Winwidth = 1 + endif + endif + + " Vertically split taglist window width setting + if !exists('Tlist_WinWidth') + let Tlist_WinWidth = 30 + endif + + " Horizontally split taglist window height setting + if !exists('Tlist_WinHeight') + let Tlist_WinHeight = 10 + endif + + " Display tag prototypes or tag names in the taglist window + if !exists('Tlist_Display_Prototype') + let Tlist_Display_Prototype = 0 + endif + + " Display tag scopes in the taglist window + if !exists('Tlist_Display_Tag_Scope') + let Tlist_Display_Tag_Scope = 1 + endif + + " Use single left mouse click to jump to a tag. By default this is disabled. + " Only double click using the mouse will be processed. + if !exists('Tlist_Use_SingleClick') + let Tlist_Use_SingleClick = 0 + endif + + " Control whether additional help is displayed as part of the taglist or + " not. Also, controls whether empty lines are used to separate the tag + " tree. + if !exists('Tlist_Compact_Format') + let Tlist_Compact_Format = 0 + endif + + " Exit Vim if only the taglist window is currently open. By default, this is + " set to zero. + if !exists('Tlist_Exit_OnlyWindow') + let Tlist_Exit_OnlyWindow = 0 + endif + + " Automatically close the folds for the non-active files in the taglist + " window + if !exists('Tlist_File_Fold_Auto_Close') + let Tlist_File_Fold_Auto_Close = 0 + endif + + " Close the taglist window when a tag is selected + if !exists('Tlist_Close_On_Select') + let Tlist_Close_On_Select = 0 + endif + + " Automatically update the taglist window to display tags for newly + " edited files + if !exists('Tlist_Auto_Update') + let Tlist_Auto_Update = 1 + endif + + " Automatically highlight the current tag + if !exists('Tlist_Auto_Highlight_Tag') + let Tlist_Auto_Highlight_Tag = 1 + endif + + " Automatically highlight the current tag on entering a buffer + if !exists('Tlist_Highlight_Tag_On_BufEnter') + let Tlist_Highlight_Tag_On_BufEnter = 1 + endif + + " Enable fold column to display the folding for the tag tree + if !exists('Tlist_Enable_Fold_Column') + let Tlist_Enable_Fold_Column = 1 + endif + + " Display the tags for only one file in the taglist window + if !exists('Tlist_Show_One_File') + let Tlist_Show_One_File = 0 + endif + + if !exists('Tlist_Max_Submenu_Items') + let Tlist_Max_Submenu_Items = 20 + endif + + if !exists('Tlist_Max_Tag_Length') + let Tlist_Max_Tag_Length = 10 + endif + + " Do not change the name of the taglist title variable. The winmanager + " plugin relies on this name to determine the title for the taglist + " plugin. + let TagList_title = "__Tag_List__" + + " Taglist debug messages + let s:tlist_msg = '' + + " Define the taglist autocommand to automatically open the taglist window + " on Vim startup + if g:Tlist_Auto_Open + autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() + endif + + " Refresh the taglist + if g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if g:Tlist_Show_Menu + autocmd GUIEnter * call s:Tlist_Menu_Init() + endif + + " When the taglist buffer is created when loading a Vim session file, + " the taglist buffer needs to be initialized. The BufFilePost event + " is used to handle this case. + autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() + + " Define the user commands to manage the taglist window + command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() + command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() + " For backwards compatiblity define the Tlist command + command! -nargs=0 -bar Tlist TlistToggle + command! -nargs=+ -complete=file TlistAddFiles + \ call s:Tlist_Add_Files() + command! -nargs=+ -complete=dir TlistAddFilesRecursive + \ call s:Tlist_Add_Files_Recursive() + command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() + command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() + command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) + " For backwards compatiblity define the TlistSync command + command! -nargs=0 -bar TlistSync TlistHighlightTag + command! -nargs=* -complete=buffer TlistShowPrototype + \ echo Tlist_Get_Tag_Prototype_By_Line() + command! -nargs=* -complete=buffer TlistShowTag + \ echo Tlist_Get_Tagname_By_Line() + command! -nargs=* -complete=file TlistSessionLoad + \ call s:Tlist_Session_Load() + command! -nargs=* -complete=file TlistSessionSave + \ call s:Tlist_Session_Save() + command! -bar TlistLock let Tlist_Auto_Update=0 + command! -bar TlistUnlock let Tlist_Auto_Update=1 + + " Commands for enabling/disabling debug and to display debug messages + command! -nargs=? -complete=file -bar TlistDebug + \ call s:Tlist_Debug_Enable() + command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() + command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() + + " Define autocommands to autoload the taglist plugin when needed. + + " Trick to get the current script ID + map xx xx + let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', + \ '\1', '') + unmap xx + + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined TagList_* source ' . + \ escape(expand(''), ' ') + + let loaded_taglist = 'fast_load_done' + + if g:Tlist_Show_Menu && has('gui_running') + call s:Tlist_Menu_Init() + endif + + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +if !exists('s:tlist_sid') + " Two or more versions of taglist plugin are installed. Don't + " load this version of the plugin. + finish +endif + +unlet! s:tlist_sid + +if loaded_taglist != 'fast_load_done' + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +" Taglist plugin functionality is available +let loaded_taglist = 'available' + +"------------------- end of user configurable options -------------------- + +" Default language specific settings for supported file types and tag types +" +" Variable name format: +" +" s:tlist_def_{vim_ftype}_settings +" +" vim_ftype - Filetype detected by Vim +" +" Value format: +" +" ;:;:;... +" +" ctags_ftype - File type supported by exuberant ctags +" flag - Flag supported by exuberant ctags to generate a tag type +" name - Name of the tag type used in the taglist window to display the +" tags of this type +" + +" assembly language +let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' + +" aspperl language +let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' + +" aspvbs language +let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' + +" awk language +let s:tlist_def_awk_settings = 'awk;f:function' + +" beta language +let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' + +" c language +let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . + \ 'v:variable;f:function' + +" c++ language +let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . + \ 'c:class;g:enum;s:struct;u:union;f:function' + +" c# language +let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . + \ 'E:event;g:enum;s:struct;i:interface;' . + \ 'p:properties;m:method' + +" cobol language +let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . + \ 'P:program;s:section' + +" eiffel language +let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' + +" erlang language +let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' + +" expect (same as tcl) language +let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' + +" fortran language +let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . + \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . + \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' + +" HTML language +let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' + +" java language +let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . + \ 'f:field;m:method' + +" javascript language +let s:tlist_def_javascript_settings = 'javascript;f:function' + +" lisp language +let s:tlist_def_lisp_settings = 'lisp;f:function' + +" lua language +let s:tlist_def_lua_settings = 'lua;f:function' + +" makefiles +let s:tlist_def_make_settings = 'make;m:macro' + +" pascal language +let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' + +" perl language +let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' + +" php language +let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' + +" python language +let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' + +" rexx language +let s:tlist_def_rexx_settings = 'rexx;s:subroutine' + +" ruby language +let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . + \ 'm:singleton method' + +" scheme language +let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' + +" shell language +let s:tlist_def_sh_settings = 'sh;f:function' + +" C shell language +let s:tlist_def_csh_settings = 'sh;f:function' + +" Z shell language +let s:tlist_def_zsh_settings = 'sh;f:function' + +" slang language +let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' + +" sml language +let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . + \ 'r:structure;t:type;v:value;f:function' + +" sql language +let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . + \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' + +" tcl language +let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' + +" vera language +let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . + \ 'f:function;g:enum;m:member;p:program;' . + \ 'P:prototype;t:task;T:typedef;v:variable;' . + \ 'x:externvar' + +"verilog language +let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . + \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' + +" vim language +let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' + +" yacc language +let s:tlist_def_yacc_settings = 'yacc;l:label' + +"------------------- end of language specific options -------------------- + +" Vim window size is changed by the taglist plugin or not +let s:tlist_winsize_chgd = -1 +" Taglist window is maximized or not +let s:tlist_win_maximized = 0 +" Name of files in the taglist +let s:tlist_file_names='' +" Number of files in the taglist +let s:tlist_file_count = 0 +" Number of filetypes supported by taglist +let s:tlist_ftype_count = 0 +" Is taglist part of other plugins like winmanager or cream? +let s:tlist_app_name = "none" +" Are we displaying brief help text +let s:tlist_brief_help = 1 +" List of files removed on user request +let s:tlist_removed_flist = "" +" Index of current file displayed in the taglist window +let s:tlist_cur_file_idx = -1 +" Taglist menu is empty or not +let s:tlist_menu_empty = 1 + +" An autocommand is used to refresh the taglist window when entering any +" buffer. We don't want to refresh the taglist window if we are entering the +" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' +" variable is used to skip the refresh of the taglist window and is set +" and cleared appropriately. +let s:Tlist_Skip_Refresh = 0 + +" Tlist_Window_Display_Help() +function! s:Tlist_Window_Display_Help() + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + if s:tlist_brief_help + " Add the brief help + call append(0, '" Press to display help text') + else + " Add the extensive help + call append(0, '" : Jump to tag definition') + call append(1, '" o : Jump to tag definition in new window') + call append(2, '" p : Preview the tag definition') + call append(3, '" : Display tag prototype') + call append(4, '" u : Update tag list') + call append(5, '" s : Select sort field') + call append(6, '" d : Remove file from taglist') + call append(7, '" x : Zoom-out/Zoom-in taglist window') + call append(8, '" + : Open a fold') + call append(9, '" - : Close a fold') + call append(10, '" * : Open all folds') + call append(11, '" = : Close all folds') + call append(12, '" [[ : Move to the start of previous file') + call append(13, '" ]] : Move to the start of next file') + call append(14, '" q : Close the taglist window') + call append(15, '" : Remove help text') + endif +endfunction + +" Tlist_Window_Toggle_Help_Text() +" Toggle taglist plugin help text between the full version and the brief +" version +function! s:Tlist_Window_Toggle_Help_Text() + if g:Tlist_Compact_Format + " In compact display mode, do not display help + return + endif + + " Include the empty line displayed after the help text + let brief_help_size = 1 + let full_help_size = 16 + + setlocal modifiable + + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Remove the currently highlighted tag. Otherwise, the help text + " might be highlighted by mistake + match none + + " Toggle between brief and full help text + if s:tlist_brief_help + let s:tlist_brief_help = 0 + + " Remove the previous help + exe '1,' . brief_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) + else + let s:tlist_brief_help = 1 + + " Remove the previous help + exe '1,' . full_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) + endif + + call s:Tlist_Window_Display_Help() + + " Restore the report option + let &report = old_report + + setlocal nomodifiable +endfunction + +" Taglist debug support +let s:tlist_debug = 0 + +" File for storing the debug messages +let s:tlist_debug_file = '' + +" Tlist_Debug_Enable +" Enable logging of taglist debug messages. +function! s:Tlist_Debug_Enable(...) + let s:tlist_debug = 1 + + " Check whether a valid file name is supplied. + if a:1 != '' + let s:tlist_debug_file = fnamemodify(a:1, ':p') + + " Empty the log file + exe 'redir! > ' . s:tlist_debug_file + redir END + + " Check whether the log file is present/created + if !filewritable(s:tlist_debug_file) + call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' + \ . s:tlist_debug_file) + let s:tlist_debug_file = '' + endif + endif +endfunction + +" Tlist_Debug_Disable +" Disable logging of taglist debug messages. +function! s:Tlist_Debug_Disable(...) + let s:tlist_debug = 0 + let s:tlist_debug_file = '' +endfunction + +" Tlist_Debug_Show +" Display the taglist debug messages in a new window +function! s:Tlist_Debug_Show() + if s:tlist_msg == '' + call s:Tlist_Warning_Msg('Taglist: No debug messages') + return + endif + + " Open a new window to display the taglist debug messages + new taglist_debug.txt + " Delete all the lines (if the buffer already exists) + silent! %delete _ + " Add the messages + silent! put =s:tlist_msg + " Move the cursor to the first line + normal! gg +endfunction + +" Tlist_Log_Msg +" Log the supplied debug message along with the time +function! s:Tlist_Log_Msg(msg) + if s:tlist_debug + if s:tlist_debug_file != '' + exe 'redir >> ' . s:tlist_debug_file + silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" + redir END + else + " Log the message into a variable + " Retain only the last 3000 characters + let len = strlen(s:tlist_msg) + if len > 3000 + let s:tlist_msg = strpart(s:tlist_msg, len - 3000) + endif + let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . + \ a:msg . "\n" + endif + endif +endfunction + +" Tlist_Warning_Msg() +" Display a message using WarningMsg highlight group +function! s:Tlist_Warning_Msg(msg) + echohl WarningMsg + echomsg a:msg + echohl None +endfunction + +" Last returned file index for file name lookup. +" Used to speed up file lookup +let s:tlist_file_name_idx_cache = -1 + +" Tlist_Get_File_Index() +" Return the index of the specified filename +function! s:Tlist_Get_File_Index(fname) + if s:tlist_file_count == 0 || a:fname == '' + return -1 + endif + + " If the new filename is same as the last accessed filename, then + " return that index + if s:tlist_file_name_idx_cache != -1 && + \ s:tlist_file_name_idx_cache < s:tlist_file_count + if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname + " Same as the last accessed file + return s:tlist_file_name_idx_cache + endif + endif + + " First, check whether the filename is present + let s_fname = a:fname . "\n" + let i = stridx(s:tlist_file_names, s_fname) + if i == -1 + let s:tlist_file_name_idx_cache = -1 + return -1 + endif + + " Second, compute the file name index + let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') + let s:tlist_file_name_idx_cache = strlen(nl_txt) + return s:tlist_file_name_idx_cache +endfunction + +" Last returned file index for line number lookup. +" Used to speed up file lookup +let s:tlist_file_lnum_idx_cache = -1 + +" Tlist_Window_Get_File_Index_By_Linenum() +" Return the index of the filename present in the specified line number +" Line number refers to the line number in the taglist window +function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')') + + " First try to see whether the new line number is within the range + " of the last returned file + if s:tlist_file_lnum_idx_cache != -1 && + \ s:tlist_file_lnum_idx_cache < s:tlist_file_count + if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && + \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end + return s:tlist_file_lnum_idx_cache + endif + endif + + let fidx = -1 + + if g:Tlist_Show_One_File + " Displaying only one file in the taglist window. Check whether + " the line is within the tags displayed for that file + if s:tlist_cur_file_idx != -1 + if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start + \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end + let fidx = s:tlist_cur_file_idx + endif + + endif + else + " Do a binary search in the taglist + let left = 0 + let right = s:tlist_file_count - 1 + + while left < right + let mid = (left + right) / 2 + + if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end + let s:tlist_file_lnum_idx_cache = mid + return mid + endif + + if a:lnum < s:tlist_{mid}_start + let right = mid - 1 + else + let left = mid + 1 + endif + endwhile + + if left >= 0 && left < s:tlist_file_count + \ && a:lnum >= s:tlist_{left}_start + \ && a:lnum <= s:tlist_{left}_end + let fidx = left + endif + endif + + let s:tlist_file_lnum_idx_cache = fidx + + return fidx +endfunction + +" Tlist_Exe_Cmd_No_Acmds +" Execute the specified Ex command after disabling autocommands +function! s:Tlist_Exe_Cmd_No_Acmds(cmd) + let old_eventignore = &eventignore + set eventignore=all + exe a:cmd + let &eventignore = old_eventignore +endfunction + +" Tlist_Skip_File() +" Check whether tag listing is supported for the specified file +function! s:Tlist_Skip_File(filename, ftype) + " Skip buffers with no names and buffers with filetype not set + if a:filename == '' || a:ftype == '' + return 1 + endif + + " Skip files which are not supported by exuberant ctags + " First check whether default settings for this filetype are available. + " If it is not available, then check whether user specified settings are + " available. If both are not available, then don't list the tags for this + " filetype + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + let var = 'g:tlist_' . a:ftype . '_settings' + if !exists(var) + return 1 + endif + endif + + " Skip files which are not readable or files which are not yet stored + " to the disk + if !filereadable(a:filename) + return 1 + endif + + return 0 +endfunction + +" Tlist_User_Removed_File +" Returns 1 if a file is removed by a user from the taglist +function! s:Tlist_User_Removed_File(filename) + return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 +endfunction + +" Tlist_Update_Remove_List +" Update the list of user removed files from the taglist +" add == 1, add the file to the removed list +" add == 0, delete the file from the removed list +function! s:Tlist_Update_Remove_List(filename, add) + if a:add + let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" + else + let idx = stridx(s:tlist_removed_flist, a:filename . "\n") + let text_before = strpart(s:tlist_removed_flist, 0, idx) + let rem_text = strpart(s:tlist_removed_flist, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + + let s:tlist_removed_flist = text_before . text_after + endif +endfunction + +" Tlist_FileType_Init +" Initialize the ctags arguments and tag variable for the specified +" file type +function! s:Tlist_FileType_Init(ftype) + call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') + " If the user didn't specify any settings, then use the default + " ctags args. Otherwise, use the settings specified by the user + let var = 'g:tlist_' . a:ftype . '_settings' + if exists(var) + " User specified ctags arguments + let settings = {var} . ';' + else + " Default ctags arguments + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + " No default settings for this file type. This filetype is + " not supported + return 0 + endif + let settings = s:tlist_def_{a:ftype}_settings . ';' + endif + + let msg = 'Taglist: Invalid ctags option setting - ' . settings + + " Format of the option that specifies the filetype and ctags arugments: + " + " ;flag1:name1;flag2:name2;flag3:name3 + " + + " Extract the file type to pass to ctags. This may be different from the + " file type detected by Vim + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let ctags_ftype = strpart(settings, 0, pos) + if ctags_ftype == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Make sure a valid filetype is supplied. If the user didn't specify a + " valid filetype, then the ctags option settings may be treated as the + " filetype + if ctags_ftype =~ ':' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Remove the file type from settings + let settings = strpart(settings, pos + 1) + if settings == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Process all the specified ctags flags. The format is + " flag1:name1;flag2:name2;flag3:name3 + let ctags_flags = '' + let cnt = 0 + while settings != '' + " Extract the flag + let pos = stridx(settings, ':') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let flag = strpart(settings, 0, pos) + if flag == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Remove the flag from settings + let settings = strpart(settings, pos + 1) + + " Extract the tag type name + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let name = strpart(settings, 0, pos) + if name == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let settings = strpart(settings, pos + 1) + + let cnt = cnt + 1 + + let s:tlist_{a:ftype}_{cnt}_name = flag + let s:tlist_{a:ftype}_{cnt}_fullname = name + let ctags_flags = ctags_flags . flag + endwhile + + let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . + \ ' --' . ctags_ftype . '-types=' . ctags_flags + let s:tlist_{a:ftype}_count = cnt + let s:tlist_{a:ftype}_ctags_flags = ctags_flags + + " Save the filetype name + let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype + let s:tlist_ftype_count = s:tlist_ftype_count + 1 + + return 1 +endfunction + +" Tlist_Detect_Filetype +" Determine the filetype for the specified file using the filetypedetect +" autocmd. +function! s:Tlist_Detect_Filetype(fname) + " Ignore the filetype autocommands + let old_eventignore = &eventignore + set eventignore=FileType + + " Save the 'filetype', as this will be changed temporarily + let old_filetype = &filetype + + " Run the filetypedetect group of autocommands to determine + " the filetype + exe 'doautocmd filetypedetect BufRead ' . a:fname + + " Save the detected filetype + let ftype = &filetype + + " Restore the previous state + let &filetype = old_filetype + let &eventignore = old_eventignore + + return ftype +endfunction + +" Tlist_Get_Buffer_Filetype +" Get the filetype for the specified buffer +function! s:Tlist_Get_Buffer_Filetype(bnum) + let buf_ft = getbufvar(a:bnum, '&filetype') + + if bufloaded(a:bnum) + " For loaded buffers, the 'filetype' is already determined + return buf_ft + endif + + " For unloaded buffers, if the 'filetype' option is set, return it + if buf_ft != '' + return buf_ft + endif + + " Skip non-existent buffers + if !bufexists(a:bnum) + return '' + endif + + " For buffers whose filetype is not yet determined, try to determine + " the filetype + let bname = bufname(a:bnum) + + return s:Tlist_Detect_Filetype(bname) +endfunction + +" Tlist_Discard_TagInfo +" Discard the stored tag information for a file +function! s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + let ftype = s:tlist_{a:fidx}_filetype + + " Discard information about the tags defined in the file + let i = 1 + while i <= s:tlist_{a:fidx}_tag_count + let fidx_i = 's:tlist_' . a:fidx . '_' . i + unlet! {fidx_i}_tag + unlet! {fidx_i}_tag_name + unlet! {fidx_i}_tag_type + unlet! {fidx_i}_ttype_idx + unlet! {fidx_i}_tag_proto + unlet! {fidx_i}_tag_searchpat + unlet! {fidx_i}_tag_linenum + let i = i + 1 + endwhile + + let s:tlist_{a:fidx}_tag_count = 0 + + " Discard information about tag type groups + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{a:fidx}_{ttype} != '' + let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype + let {fidx_ttype} = '' + let {fidx_ttype}_offset = 0 + let cnt = {fidx_ttype}_count + let {fidx_ttype}_count = 0 + let j = 1 + while j <= cnt + unlet! {fidx_ttype}_{j} + let j = j + 1 + endwhile + endif + let i = i + 1 + endwhile + + " Discard the stored menu command also + let s:tlist_{a:fidx}_menu_cmd = '' +endfunction + +" Tlist_Window_Update_Line_Offsets +" Update the line offsets for tags for files starting from start_idx +" and displayed in the taglist window by the specified offset +function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset) + let i = a:start_idx + + while i < s:tlist_file_count + if s:tlist_{i}_visible + " Update the start/end line number only if the file is visible + if a:increment + let s:tlist_{i}_start = s:tlist_{i}_start + a:offset + let s:tlist_{i}_end = s:tlist_{i}_end + a:offset + else + let s:tlist_{i}_start = s:tlist_{i}_start - a:offset + let s:tlist_{i}_end = s:tlist_{i}_end - a:offset + endif + endif + let i = i + 1 + endwhile +endfunction + +" Tlist_Discard_FileInfo +" Discard the stored information for a file +function! s:Tlist_Discard_FileInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + call s:Tlist_Discard_TagInfo(a:fidx) + + let ftype = s:tlist_{a:fidx}_filetype + + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + unlet! s:tlist_{a:fidx}_{ttype} + unlet! s:tlist_{a:fidx}_{ttype}_offset + unlet! s:tlist_{a:fidx}_{ttype}_count + let i = i + 1 + endwhile + + unlet! s:tlist_{a:fidx}_filename + unlet! s:tlist_{a:fidx}_sort_type + unlet! s:tlist_{a:fidx}_filetype + unlet! s:tlist_{a:fidx}_mtime + unlet! s:tlist_{a:fidx}_start + unlet! s:tlist_{a:fidx}_end + unlet! s:tlist_{a:fidx}_valid + unlet! s:tlist_{a:fidx}_visible + unlet! s:tlist_{a:fidx}_tag_count + unlet! s:tlist_{a:fidx}_menu_cmd +endfunction + +" Tlist_Window_Remove_File_From_Display +" Remove the specified file from display +function! s:Tlist_Window_Remove_File_From_Display(fidx) + call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' . + \ s:tlist_{a:fidx}_filename . ')') + " If the file is not visible then no need to remove it + if !s:tlist_{a:fidx}_visible + return + endif + + " Remove the tags displayed for the specified file from the window + let start = s:tlist_{a:fidx}_start + " Include the empty line after the last line also + if g:Tlist_Compact_Format + let end = s:tlist_{a:fidx}_end + else + let end = s:tlist_{a:fidx}_end + 1 + endif + + setlocal modifiable + exe 'silent! ' . start . ',' . end . 'delete _' + setlocal nomodifiable + + " Correct the start and end line offsets for all the files following + " this file, as the tags for this file are removed + call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) +endfunction + +" Tlist_Remove_File +" Remove the file under the cursor or the specified file index +" user_request - User requested to remove the file from taglist +function! s:Tlist_Remove_File(file_idx, user_request) + let fidx = a:file_idx + + if fidx == -1 + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + endif + call s:Tlist_Log_Msg('Tlist_Remove_File (' . + \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') + + let save_winnr = winnr() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Taglist window is open, remove the file from display + + if save_winnr != winnum + let old_eventignore = &eventignore + set eventignore=all + exe winnum . 'wincmd w' + endif + + call s:Tlist_Window_Remove_File_From_Display(fidx) + + if save_winnr != winnum + exe save_winnr . 'wincmd w' + let &eventignore = old_eventignore + endif + endif + + let fname = s:tlist_{fidx}_filename + + if a:user_request + " As the user requested to remove the file from taglist, + " add it to the removed list + call s:Tlist_Update_Remove_List(fname, 1) + endif + + " Remove the file name from the taglist list of filenames + let idx = stridx(s:tlist_file_names, fname . "\n") + let text_before = strpart(s:tlist_file_names, 0, idx) + let rem_text = strpart(s:tlist_file_names, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + let s:tlist_file_names = text_before . text_after + + call s:Tlist_Discard_FileInfo(fidx) + + " Shift all the file variables by one index + let i = fidx + 1 + + while i < s:tlist_file_count + let j = i - 1 + + let s:tlist_{j}_filename = s:tlist_{i}_filename + let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type + let s:tlist_{j}_filetype = s:tlist_{i}_filetype + let s:tlist_{j}_mtime = s:tlist_{i}_mtime + let s:tlist_{j}_start = s:tlist_{i}_start + let s:tlist_{j}_end = s:tlist_{i}_end + let s:tlist_{j}_valid = s:tlist_{i}_valid + let s:tlist_{j}_visible = s:tlist_{i}_visible + let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count + let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd + + let k = 1 + while k <= s:tlist_{j}_tag_count + let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag + let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name + let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) + let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx + let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) + let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) + let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) + let k = k + 1 + endwhile + + let ftype = s:tlist_{i}_filetype + + let k = 1 + while k <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{k}_name + let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} + let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset + let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count + if s:tlist_{j}_{ttype} != '' + let l = 1 + while l <= s:tlist_{j}_{ttype}_count + let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} + let l = l + 1 + endwhile + endif + let k = k + 1 + endwhile + + " As the file and tag information is copied to the new index, + " discard the previous information + call s:Tlist_Discard_FileInfo(i) + + let i = i + 1 + endwhile + + " Reduce the number of files displayed + let s:tlist_file_count = s:tlist_file_count - 1 + + if g:Tlist_Show_One_File + " If the tags for only one file is displayed and if we just + " now removed that file, then invalidate the current file idx + if s:tlist_cur_file_idx == fidx + let s:tlist_cur_file_idx = -1 + endif + endif +endfunction + +" Tlist_Window_Goto_Window +" Goto the taglist window +function! s:Tlist_Window_Goto_Window() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + if winnr() != winnum + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + endif +endfunction + +" Tlist_Window_Create +" Create a new taglist window. If it is already open, jump to it +function! s:Tlist_Window_Create() + call s:Tlist_Log_Msg('Tlist_Window_Create()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + " If used with winmanager don't open windows. Winmanager will handle + " the window/buffer management + if s:tlist_app_name == "winmanager" + return + endif + + " Create a new window. If user prefers a horizontal window, then open + " a horizontally split window. Otherwise open a vertically split + " window + if g:Tlist_Use_Horiz_Window + " Open a horizontally split window + let win_dir = 'botright' + " Horizontal window height + let win_size = g:Tlist_WinHeight + else + if s:tlist_winsize_chgd == -1 + " Open a vertically split window. Increase the window size, if + " needed, to accomodate the new window + if g:Tlist_Inc_Winwidth && + \ &columns < (80 + g:Tlist_WinWidth) + " Save the original window position + let s:tlist_pre_winx = getwinposx() + let s:tlist_pre_winy = getwinposy() + + " one extra column is needed to include the vertical split + let &columns= &columns + g:Tlist_WinWidth + 1 + + let s:tlist_winsize_chgd = 1 + else + let s:tlist_winsize_chgd = 0 + endif + endif + + if g:Tlist_Use_Right_Window + " Open the window at the rightmost place + let win_dir = 'botright vertical' + else + " Open the window at the leftmost place + let win_dir = 'topleft vertical' + endif + let win_size = g:Tlist_WinWidth + endif + + " If the tag listing temporary buffer already exists, then reuse it. + " Otherwise create a new buffer + let bufnum = bufnr(g:TagList_title) + if bufnum == -1 + " Create a new buffer + let wcmd = g:TagList_title + else + " Edit the existing buffer + let wcmd = '+buffer' . bufnum + endif + + " Create the taglist window + exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd + + " Save the new window position + let s:tlist_winx = getwinposx() + let s:tlist_winy = getwinposy() + + " Initialize the taglist window + call s:Tlist_Window_Init() +endfunction + +" Tlist_Window_Zoom +" Zoom (maximize/minimize) the taglist window +function! s:Tlist_Window_Zoom() + if s:tlist_win_maximized + " Restore the window back to the previous size + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vert resize ' . g:Tlist_WinWidth + endif + let s:tlist_win_maximized = 0 + else + " Set the window size to the maximum possible without closing other + " windows + if g:Tlist_Use_Horiz_Window + resize + else + vert resize + endif + let s:tlist_win_maximized = 1 + endif +endfunction + +" Tlist_Ballon_Expr +" When the mouse cursor is over a tag in the taglist window, display the +" tag prototype (balloon) +function! Tlist_Ballon_Expr() + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) + if fidx == -1 + return '' + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) + if tidx == 0 + return '' + endif + + " Get the tag search pattern and display it + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Window_Check_Width +" Check the width of the taglist window. For horizontally split windows, the +" 'winfixheight' option is used to fix the height of the window. For +" vertically split windows, Vim doesn't support the 'winfixwidth' option. So +" need to handle window width changes from this function. +function! s:Tlist_Window_Check_Width() + let tlist_winnr = bufwinnr(g:TagList_title) + if tlist_winnr == -1 + return + endif + + let width = winwidth(tlist_winnr) + if width != g:Tlist_WinWidth + call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . + \ "width from " . width . " to " . g:Tlist_WinWidth) + let save_winnr = winnr() + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') + endif + exe 'vert resize ' . g:Tlist_WinWidth + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Window_Exit_Only_Window +" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the +" taglist window is present. +function! s:Tlist_Window_Exit_Only_Window() + " Before quitting Vim, delete the taglist buffer so that + " the '0 mark is correctly set to the previous buffer. + if v:version < 700 + if winbufnr(2) == -1 + bdelete + quit + endif + else + if winbufnr(2) == -1 + if tabpagenr('$') == 1 + " Only one tag page is present + bdelete + quit + else + " More than one tab page is present. Close only the current + " tab page + close + endif + endif + endif +endfunction + +" Tlist_Window_Init +" Set the default options for the taglist window +function! s:Tlist_Window_Init() + call s:Tlist_Log_Msg('Tlist_Window_Init()') + + " The 'readonly' option should not be set for the taglist buffer. + " If Vim is started as "view/gview" or if the ":view" command is + " used, then the 'readonly' option is set for all the buffers. + " Unset it for the taglist buffer + setlocal noreadonly + + " Set the taglist buffer filetype to taglist + setlocal filetype=taglist + + " Define taglist window element highlighting + syntax match TagListComment '^" .*' + syntax match TagListFileName '^[^" ].*$' + syntax match TagListTitle '^ \S.*$' + syntax match TagListTagScope '\s\[.\{-\}\]$' + + " Define the highlighting only if colors are supported + if has('gui_running') || &t_Co > 2 + " Colors to highlight various taglist window elements + " If user defined highlighting group exists, then use them. + " Otherwise, use default highlight groups. + if hlexists('MyTagListTagName') + highlight link TagListTagName MyTagListTagName + else + highlight default link TagListTagName Search + endif + " Colors to highlight comments and titles + if hlexists('MyTagListComment') + highlight link TagListComment MyTagListComment + else + highlight clear TagListComment + highlight default link TagListComment Comment + endif + if hlexists('MyTagListTitle') + highlight link TagListTitle MyTagListTitle + else + highlight clear TagListTitle + highlight default link TagListTitle Title + endif + if hlexists('MyTagListFileName') + highlight link TagListFileName MyTagListFileName + else + highlight clear TagListFileName + highlight default TagListFileName guibg=Grey ctermbg=darkgray + \ guifg=white ctermfg=white + endif + if hlexists('MyTagListTagScope') + highlight link TagListTagScope MyTagListTagScope + else + highlight clear TagListTagScope + highlight default link TagListTagScope Identifier + endif + else + highlight default TagListTagName term=reverse cterm=reverse + endif + + " Folding related settings + setlocal foldenable + setlocal foldminlines=0 + setlocal foldmethod=manual + setlocal foldlevel=9999 + if g:Tlist_Enable_Fold_Column + setlocal foldcolumn=3 + else + setlocal foldcolumn=0 + endif + setlocal foldtext=v:folddashes.getline(v:foldstart) + + if s:tlist_app_name != "winmanager" + " Mark buffer as scratch + silent! setlocal buftype=nofile + if s:tlist_app_name == "none" + silent! setlocal bufhidden=delete + endif + silent! setlocal noswapfile + " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted + " buffers. So if the taglist buffer is unlisted, multiple taglist + " windows will be opened. This bug is fixed in Vim 6.1 and above + if v:version >= 601 + silent! setlocal nobuflisted + endif + endif + + silent! setlocal nowrap + + " If the 'number' option is set in the source window, it will affect the + " taglist window. So forcefully disable 'number' option for the taglist + " window + silent! setlocal nonumber + + " Use fixed height when horizontally split window is used + if g:Tlist_Use_Horiz_Window + if v:version >= 602 + set winfixheight + endif + endif + if !g:Tlist_Use_Horiz_Window && v:version >= 700 + set winfixwidth + endif + + " Setup balloon evaluation to display tag prototype + if v:version >= 700 && has('balloon_eval') + setlocal balloonexpr=Tlist_Ballon_Expr() + set ballooneval + endif + + " Setup the cpoptions properly for the maps to work + let old_cpoptions = &cpoptions + set cpoptions&vim + + " Create buffer local mappings for jumping to the tags and sorting the list + nnoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + nnoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + nnoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + nnoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + nnoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + nnoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + nnoremap + :silent! foldopen + nnoremap - :silent! foldclose + nnoremap * :silent! %foldopen! + nnoremap = :silent! %foldclose + nnoremap :silent! foldopen + nnoremap :silent! foldclose + nnoremap :silent! %foldopen! + nnoremap :call Tlist_Window_Show_Info() + nnoremap u :call Tlist_Window_Update_File() + nnoremap d :call Tlist_Remove_File(-1, 1) + nnoremap x :call Tlist_Window_Zoom() + nnoremap [[ :call Tlist_Window_Move_To_File(-1) + nnoremap :call Tlist_Window_Move_To_File(-1) + nnoremap ]] :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Toggle_Help_Text() + nnoremap q :close + + " Insert mode mappings + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + " Windows needs return + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + inoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + inoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + inoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + inoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + inoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + inoremap + :silent! foldopen + inoremap - :silent! foldclose + inoremap * :silent! %foldopen! + inoremap = :silent! %foldclose + inoremap :silent! foldopen + inoremap :silent! foldclose + inoremap :silent! %foldopen! + inoremap :call + \ Tlist_Window_Show_Info() + inoremap u + \ :call Tlist_Window_Update_File() + inoremap d :call Tlist_Remove_File(-1, 1) + inoremap x :call Tlist_Window_Zoom() + inoremap [[ :call Tlist_Window_Move_To_File(-1) + inoremap :call Tlist_Window_Move_To_File(-1) + inoremap ]] :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Toggle_Help_Text() + inoremap q :close + + " Map single left mouse click if the user wants this functionality + if g:Tlist_Use_SingleClick == 1 + " Contributed by Bindu Wavell + " attempt to perform single click mapping, it would be much + " nicer if we could nnoremap ... however vim does + " not fire the when you use the mouse + " to enter a buffer. + let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . + \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . + \ ' endif ' + if maparg('', 'n') == '' + " no mapping for leftmouse + exe ':nnoremap ' . clickmap + else + " we have a mapping + let mapcmd = ':nnoremap ' + let mapcmd = mapcmd . substitute(substitute( + \ maparg('', 'n'), '|', '', 'g'), + \ '\c^', '', '') + let mapcmd = mapcmd . clickmap + exe mapcmd + endif + endif + + " Define the taglist autocommands + augroup TagListAutoCmds + autocmd! + " Display the tag prototype for the tag under the cursor. + autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() + " Highlight the current tag periodically + autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0) + + " Adjust the Vim window width when taglist window is closed + autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() + " Close the fold for this buffer when leaving the buffer + if g:Tlist_File_Fold_Auto_Close + autocmd BufEnter * silent + \ call s:Tlist_Window_Open_File_Fold(expand('')) + endif + " Exit Vim itself if only the taglist window is present (optional) + if g:Tlist_Exit_OnlyWindow + autocmd BufEnter __Tag_List__ nested + \ call s:Tlist_Window_Exit_Only_Window() + endif + if s:tlist_app_name != "winmanager" && + \ !g:Tlist_Process_File_Always && + \ (!has('gui_running') || !g:Tlist_Show_Menu) + " Auto refresh the taglist window + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if !g:Tlist_Use_Horiz_Window + if v:version < 700 + autocmd WinEnter * call s:Tlist_Window_Check_Width() + endif + endif + if v:version >= 700 + autocmd TabEnter * silent call s:Tlist_Refresh_Folds() + endif + augroup end + + " Restore the previous cpoptions settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Window_Refresh +" Display the tags for all the files in the taglist window +function! s:Tlist_Window_Refresh() + call s:Tlist_Log_Msg('Tlist_Window_Refresh()') + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Mark the buffer as modifiable + setlocal modifiable + + " Delete the contents of the buffer to the black-hole register + silent! %delete _ + + " As we have cleared the taglist window, mark all the files + " as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + if g:Tlist_Compact_Format == 0 + " Display help in non-compact mode + call s:Tlist_Window_Display_Help() + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " If the tags for only one file should be displayed in the taglist + " window, then no need to add the tags here. The bufenter autocommand + " will add the tags for that file. + if g:Tlist_Show_One_File + return + endif + + " List all the tags for the previously processed files + " Do this only if taglist is configured to display tags for more than + " one file. Otherwise, when Tlist_Show_One_File is configured, + " tags for the wrong file will be displayed. + let i = 0 + while i < s:tlist_file_count + call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, + \ s:tlist_{i}_filetype) + let i = i + 1 + endwhile + + if g:Tlist_Auto_Update + " Add and list the tags for all buffers in the Vim buffer list + let i = 1 + let last_bufnum = bufnr('$') + while i <= last_bufnum + if buflisted(i) + let fname = fnamemodify(bufname(i), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(i) + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(fname, ftype) + call s:Tlist_Window_Refresh_File(fname, ftype) + endif + endif + let i = i + 1 + endwhile + endif + + " If Tlist_File_Fold_Auto_Close option is set, then close all the folds + if g:Tlist_File_Fold_Auto_Close + " Close all the folds + silent! %foldclose + endif + + " Move the cursor to the top of the taglist window + normal! gg +endfunction + +" Tlist_Post_Close_Cleanup() +" Close the taglist window and adjust the Vim window width +function! s:Tlist_Post_Close_Cleanup() + call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') + " Mark all the files as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + " Remove the taglist autocommands + silent! autocmd! TagListAutoCmds + + " Clear all the highlights + match none + + silent! syntax clear TagListTitle + silent! syntax clear TagListComment + silent! syntax clear TagListTagScope + + " Remove the left mouse click mapping if it was setup initially + if g:Tlist_Use_SingleClick + if hasmapto('') + nunmap + endif + endif + + if s:tlist_app_name != "winmanager" + if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || + \ s:tlist_winsize_chgd != 1 || + \ &columns < (80 + g:Tlist_WinWidth) + " No need to adjust window width if using horizontally split taglist + " window or if columns is less than 101 or if the user chose not to + " adjust the window width + else + " If the user didn't manually move the window, then restore the window + " position to the pre-taglist position + if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && + \ getwinposx() == s:tlist_winx && + \ getwinposy() == s:tlist_winy + exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy + endif + + " Adjust the Vim window width + let &columns= &columns - (g:Tlist_WinWidth + 1) + endif + endif + + let s:tlist_winsize_chgd = -1 + + " Reset taglist state variables + if s:tlist_app_name == "winmanager" + let s:tlist_app_name = "none" + endif + let s:tlist_window_initialized = 0 +endfunction + +" Tlist_Window_Refresh_File() +" List the tags defined in the specified file in a Vim window +function! s:Tlist_Window_Refresh_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx != -1 + let file_listed = 1 + else + let file_listed = 0 + endif + + if !file_listed + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(a:filename) + return + endif + endif + + if file_listed && s:tlist_{fidx}_visible + " Check whether the file tags are currently valid + if s:tlist_{fidx}_valid + " Goto the first line in the file + exe s:tlist_{fidx}_start + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + return + endif + + " Discard and remove the tags for this file from display + call s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Window_Remove_File_From_Display(fidx) + endif + + " Process and generate a list of tags defined in the file + if !file_listed || !s:tlist_{fidx}_valid + let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) + if ret_fidx == -1 + return + endif + let fidx = ret_fidx + endif + + " Set report option to a huge value to prevent informational messages + " while adding lines to the taglist window + let old_report = &report + set report=99999 + + if g:Tlist_Show_One_File + " Remove the previous file + if s:tlist_cur_file_idx != -1 + call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx) + let s:tlist_{s:tlist_cur_file_idx}_visible = 0 + let s:tlist_{s:tlist_cur_file_idx}_start = 0 + let s:tlist_{s:tlist_cur_file_idx}_end = 0 + endif + let s:tlist_cur_file_idx = fidx + endif + + " Mark the buffer as modifiable + setlocal modifiable + + " Add new files to the end of the window. For existing files, add them at + " the same line where they were previously present. If the file is not + " visible, then add it at the end + if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible + if g:Tlist_Compact_Format + let s:tlist_{fidx}_start = line('$') + else + let s:tlist_{fidx}_start = line('$') + 1 + endif + endif + + let s:tlist_{fidx}_visible = 1 + + " Goto the line where this file should be placed + if g:Tlist_Compact_Format + exe s:tlist_{fidx}_start + else + exe s:tlist_{fidx}_start - 1 + endif + + let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . + \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' + if g:Tlist_Compact_Format == 0 + silent! put =txt + else + silent! put! =txt + " Move to the next line + exe line('.') + 1 + endif + let file_start = s:tlist_{fidx}_start + + " Add the tag names grouped by tag type to the buffer with a title + let i = 1 + let ttype_cnt = s:tlist_{a:ftype}_count + while i <= ttype_cnt + let ttype = s:tlist_{a:ftype}_{i}_name + " Add the tag type only if there are tags for that type + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + let ttype_txt = {fidx_ttype} + if ttype_txt != '' + let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname + if g:Tlist_Compact_Format == 0 + let ttype_start_lnum = line('.') + 1 + silent! put =txt + else + let ttype_start_lnum = line('.') + silent! put! =txt + endif + silent! put =ttype_txt + + let {fidx_ttype}_offset = ttype_start_lnum - file_start + + " create a fold for this tag type + let fold_start = ttype_start_lnum + let fold_end = fold_start + {fidx_ttype}_count + exe fold_start . ',' . fold_end . 'fold' + + " Adjust the cursor position + if g:Tlist_Compact_Format == 0 + exe ttype_start_lnum + {fidx_ttype}_count + else + exe ttype_start_lnum + {fidx_ttype}_count + 1 + endif + + if g:Tlist_Compact_Format == 0 + " Separate the tag types by a empty line + silent! put ='' + endif + endif + let i = i + 1 + endwhile + + if s:tlist_{fidx}_tag_count == 0 + if g:Tlist_Compact_Format == 0 + silent! put ='' + endif + endif + + let s:tlist_{fidx}_end = line('.') - 1 + + " Create a fold for the entire file + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + + " Goto the starting line for this file, + exe s:tlist_{fidx}_start + + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " Update the start and end line numbers for all the files following this + " file + let start = s:tlist_{fidx}_start + " include the empty line after the last line + if g:Tlist_Compact_Format + let end = s:tlist_{fidx}_end + else + let end = s:tlist_{fidx}_end + 1 + endif + call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1) + + " Now that we have updated the taglist window, update the tags + " menu (if present) + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Init_File +" Initialize the variables for a new file +function! s:Tlist_Init_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') + " Add new files at the end of the list + let fidx = s:tlist_file_count + let s:tlist_file_count = s:tlist_file_count + 1 + " Add the new file name to the taglist list of file names + let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" + + " Initialize the file variables + let s:tlist_{fidx}_filename = a:filename + let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type + let s:tlist_{fidx}_filetype = a:ftype + let s:tlist_{fidx}_mtime = -1 + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + let s:tlist_{fidx}_valid = 0 + let s:tlist_{fidx}_visible = 0 + let s:tlist_{fidx}_tag_count = 0 + let s:tlist_{fidx}_menu_cmd = '' + + " Initialize the tag type variables + let i = 1 + while i <= s:tlist_{a:ftype}_count + let ttype = s:tlist_{a:ftype}_{i}_name + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + let i = i + 1 + endwhile + + return fidx +endfunction + +" Tlist_Get_Tag_Type_By_Tag +" Return the tag type for the specified tag index +function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' + + " Already parsed and have the tag name + if exists(ttype_var) + return {ttype_var} + endif + + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) + + return {ttype_var} +endfunction + +" Tlist_Get_Tag_Prototype +function! s:Tlist_Get_Tag_Prototype(fidx, tidx) + let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' + + " Already parsed and have the tag prototype + if exists(tproto_var) + return {tproto_var} + endif + + " Parse and extract the tag prototype + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let tag_proto = strpart(tag_line, start, end - start) + let {tproto_var} = substitute(tag_proto, '\s*', '', '') + + return {tproto_var} +endfunction + +" Tlist_Get_Tag_SearchPat +function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) + let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' + + " Already parsed and have the tag search pattern + if exists(tpat_var) + return {tpat_var} + endif + + " Parse and extract the tag search pattern + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . + \ (tag_line[end] == '$' ? '\$' : '') + + return {tpat_var} +endfunction + +" Tlist_Get_Tag_Linenum +" Return the tag line number, given the tag index +function! s:Tlist_Get_Tag_Linenum(fidx, tidx) + let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' + + " Already parsed and have the tag line number + if exists(tline_var) + return {tline_var} + endif + + " Parse and extract the tag line number + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = strridx(tag_line, 'line:') + 5 + let end = strridx(tag_line, "\t") + if end < start + let {tline_var} = strpart(tag_line, start) + 0 + else + let {tline_var} = strpart(tag_line, start, end - start) + 0 + endif + + return {tline_var} +endfunction + +" Tlist_Parse_Tagline +" Parse a tag line from the ctags output. Separate the tag output based on the +" tag type and store it in the tag type variable. +" The format of each line in the ctags output is: +" +" tag_namefile_nameex_cmd;"extension_fields +" +function! s:Tlist_Parse_Tagline(tag_line) + if a:tag_line == '' + " Skip empty lines + return + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(a:tag_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(s:ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not supported + return + endif + + " Update the total tag count + let s:tidx = s:tidx + 1 + + " The following variables are used to optimize this code. Vim is slow in + " using curly brace names. To reduce the amount of processing needed, the + " curly brace variables are pre-processed here + let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx + let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = a:tag_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = s:tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name +endfunction + +" Tlist_Process_File +" Get the list of tags defined in the specified file and store them +" in Vim variables. Returns the file index where the tags are stored. +function! s:Tlist_Process_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . + \ a:ftype . ')') + " Check whether this file is supported + if s:Tlist_Skip_File(a:filename, a:ftype) + return -1 + endif + + " If the tag types for this filetype are not yet created, then create + " them now + let var = 's:tlist_' . a:ftype . '_count' + if !exists(var) + if s:Tlist_FileType_Init(a:ftype) == 0 + return -1 + endif + endif + + " If this file is already processed, then use the cached values + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " First time, this file is loaded + let fidx = s:Tlist_Init_File(a:filename, a:ftype) + else + " File was previously processed. Discard the tag information + call s:Tlist_Discard_TagInfo(fidx) + endif + + let s:tlist_{fidx}_valid = 1 + + " Exuberant ctags arguments to generate a tag list + let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' + + " Form the ctags argument depending on the sort type + if s:tlist_{fidx}_sort_type == 'name' + let ctags_args = ctags_args . '--sort=yes' + else + let ctags_args = ctags_args . '--sort=no' + endif + + " Add the filetype specific arguments + let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args + + " Ctags command to produce output with regexp for locating the tags + let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args + let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' + + if &shellxquote == '"' + " Double-quotes within double-quotes will not work in the + " command-line.If the 'shellxquote' option is set to double-quotes, + " then escape the double-quotes in the ctags command-line. + let ctags_cmd = escape(ctags_cmd, '"') + endif + + " In Windows 95, if not using cygwin, disable the 'shellslash' + " option. Otherwise, this will cause problems when running the + " ctags command. + if has('win95') && !has('win32unix') + let old_shellslash = &shellslash + set noshellslash + endif + + if has('win32') && !has('win32unix') && !has('win95') + \ && (&shell =~ 'cmd.exe') + " Windows does not correctly deal with commands that have more than 1 + " set of double quotes. It will strip them all resulting in: + " 'C:\Program' is not recognized as an internal or external command + " operable program or batch file. To work around this, place the + " command inside a batch file and call the batch file. + " Do this only on Win2K, WinXP and above. + " Contributed by: David Fishburn. + let s:taglist_tempfile = fnamemodify(tempname(), ':h') . + \ '\taglist.cmd' + exe 'redir! > ' . s:taglist_tempfile + silent echo ctags_cmd + redir END + + call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) + let ctags_cmd = '"' . s:taglist_tempfile . '"' + endif + + call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) + + " Run ctags and get the tag list + let cmd_output = system(ctags_cmd) + + " Restore the value of the 'shellslash' option. + if has('win95') && !has('win32unix') + let &shellslash = old_shellslash + endif + + if exists('s:taglist_tempfile') + " Delete the temporary cmd file created on MS-Windows + call delete(s:taglist_tempfile) + endif + + " Handle errors + if v:shell_error + let msg = "Taglist: Failed to generate tags for " . a:filename + call s:Tlist_Warning_Msg(msg) + if cmd_output != '' + call s:Tlist_Warning_Msg(cmd_output) + endif + return fidx + endif + + " Store the modification time for the file + let s:tlist_{fidx}_mtime = getftime(a:filename) + + " No tags for current file + if cmd_output == '' + call s:Tlist_Log_Msg('No tags defined in ' . a:filename) + return fidx + endif + + call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) + + if v:version > 601 + " The following script local variables are used by the + " Tlist_Parse_Tagline() function. + let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags + let s:fidx = fidx + let s:tidx = 0 + + " Process the ctags output one line at a time. The substitute() + " command is used to parse the tag lines instead of using the + " matchstr()/stridx()/strpart() functions for performance reason + call substitute(cmd_output, "\\([^\n]\\+\\)\n", + \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = s:tidx + + " The following script local variables are no longer needed + unlet! s:ctags_flags + unlet! s:tidx + unlet! s:fidx + else + " Due to a bug in Vim earlier than version 6.1, + " we cannot use substitute() to parse the ctags output. + " Instead the slow str*() functions are used + let ctags_flags = s:tlist_{a:ftype}_ctags_flags + let tidx = 0 + + while cmd_output != '' + " Extract one line at a time + let idx = stridx(cmd_output, "\n") + let one_line = strpart(cmd_output, 0, idx) + " Remove the line from the tags output + let cmd_output = strpart(cmd_output, idx + 1) + + if one_line == '' + " Line is not in proper tags format + continue + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(one_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not + " supported + continue + endif + + " Update the total tag count + let tidx = tidx + 1 + + " The following variables are used to optimize this code. Vim is + " slow in using curly brace names. To reduce the amount of + " processing needed, the curly brace variables are pre-processed + " here + let fidx_tidx = 's:tlist_' . fidx . '_' . tidx + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = one_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name + endwhile + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = tidx + endif + + call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . + \ ' tags in ' . a:filename) + + return fidx +endfunction + +" Tlist_Update_File +" Update the tags for a file (if needed) +function! Tlist_Update_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(a:filename, a:ftype) + return + endif + + " Convert the file name to a full path + let fname = fnamemodify(a:filename, ':p') + + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(fname) + + if fidx != -1 && s:tlist_{fidx}_valid + " File exists and the tags are valid + " Check whether the file was modified after the last tags update + " If it is modified, then update the tags + if s:tlist_{fidx}_mtime == getftime(fname) + return + endif + else + " If the tags were removed previously based on a user request, + " as we are going to update the tags (based on the user request), + " remove the filename from the deleted list + call s:Tlist_Update_Remove_List(fname, 0) + endif + + " If the taglist window is opened, update it + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + " Taglist window is not present. Just update the taglist + " and return + call s:Tlist_Process_File(fname, a:ftype) + else + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 + " If tags for only one file are displayed and we are not + " updating the tags for that file, then no need to + " refresh the taglist window. Otherwise, the taglist + " window should be updated. + if s:tlist_{s:tlist_cur_file_idx}_filename != fname + call s:Tlist_Process_File(fname, a:ftype) + return + endif + endif + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + + " Update the taglist window + call s:Tlist_Window_Refresh_File(fname, a:ftype) + + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + + if winnr() != save_winnr + " Go back to the original window + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Window_Close +" Close the taglist window +function! s:Tlist_Window_Close() + call s:Tlist_Log_Msg('Tlist_Window_Close()') + " Make sure the taglist window exists + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + if winnr() == winnum + " Already in the taglist window. Close it and return + if winbufnr(2) != -1 + " If a window other than the taglist window is open, + " then only close the taglist window. + close + endif + else + " Goto the taglist window, close it and then come back to the + " original window + let curbufnr = bufnr('%') + exe winnum . 'wincmd w' + close + " Need to jump back to the original window only if we are not + " already in that window + let winnum = bufwinnr(curbufnr) + if winnr() != winnum + exe winnum . 'wincmd w' + endif + endif +endfunction + +" Tlist_Window_Mark_File_Window +" Mark the current window as the file window to use when jumping to a tag. +" Only if the current window is a non-plugin, non-preview and non-taglist +" window +function! s:Tlist_Window_Mark_File_Window() + if getbufvar('%', '&buftype') == '' && !&previewwindow + let w:tlist_file_window = "yes" + endif +endfunction + +" Tlist_Window_Open +" Open and refresh the taglist window +function! s:Tlist_Window_Open() + call s:Tlist_Log_Msg('Tlist_Window_Open()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + if s:tlist_app_name == "winmanager" + " Taglist plugin is no longer part of the winmanager app + let s:tlist_app_name = "none" + endif + + " Get the filename and filetype for the specified buffer + let curbuf_name = fnamemodify(bufname('%'), ':p') + let curbuf_ftype = s:Tlist_Get_Buffer_Filetype('%') + let cur_lnum = line('.') + + " Mark the current window as the desired window to open a file when a tag + " is selected. + call s:Tlist_Window_Mark_File_Window() + + " Open the taglist window + call s:Tlist_Window_Create() + + call s:Tlist_Window_Refresh() + + if g:Tlist_Show_One_File + " Add only the current buffer and file + " + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) + call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) + endif + endif + + if g:Tlist_File_Fold_Auto_Close + " Open the fold for the current file, as all the folds in + " the taglist window are closed + let fidx = s:Tlist_Get_File_Index(curbuf_name) + if fidx != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) +endfunction + +" Tlist_Window_Toggle() +" Open or close a taglist window +function! s:Tlist_Window_Toggle() + call s:Tlist_Log_Msg('Tlist_Window_Toggle()') + " If taglist window is open then close it. + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + call s:Tlist_Window_Close() + return + endif + + call s:Tlist_Window_Open() + + " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not + " set + if !g:Tlist_GainFocus_On_ToggleOpen + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Process_Filelist +" Process multiple files. Each filename is separated by "\n" +" Returns the number of processed files +function! s:Tlist_Process_Filelist(file_names) + let flist = a:file_names + + " Enable lazy screen updates + let old_lazyredraw = &lazyredraw + set lazyredraw + + " Keep track of the number of processed files + let fcnt = 0 + + " Process one file at a time + while flist != '' + let nl_idx = stridx(flist, "\n") + let one_file = strpart(flist, 0, nl_idx) + + " Remove the filename from the list + let flist = strpart(flist, nl_idx + 1) + + if one_file == '' + continue + endif + + " Skip directories + if isdirectory(one_file) + continue + endif + + let ftype = s:Tlist_Detect_Filetype(one_file) + + echon "\r " + echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') + + let fcnt = fcnt + 1 + + call Tlist_Update_File(one_file, ftype) + endwhile + + " Clear the displayed informational messages + echon "\r " + + " Restore the previous state + let &lazyredraw = old_lazyredraw + + return fcnt +endfunction + +" Tlist_Process_Dir +" Process the files in a directory matching the specified pattern +function! s:Tlist_Process_Dir(dir_name, pat) + let flist = glob(a:dir_name . '/' . a:pat) . "\n" + + let fcnt = s:Tlist_Process_Filelist(flist) + + let len = strlen(a:dir_name) + if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/' + let glob_expr = a:dir_name . '*' + else + let glob_expr = a:dir_name . '/*' + endif + let all_files = glob(glob_expr) . "\n" + + while all_files != '' + let nl_idx = stridx(all_files, "\n") + let one_file = strpart(all_files, 0, nl_idx) + + let all_files = strpart(all_files, nl_idx + 1) + if one_file == '' + continue + endif + + " Skip non-directory names + if !isdirectory(one_file) + continue + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(one_file, ':t') + let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat) + endwhile + + return fcnt +endfunction + +" Tlist_Add_Files_Recursive +" Add files recursively from a directory +function! s:Tlist_Add_Files_Recursive(dir, ...) + let dir_name = fnamemodify(a:dir, ':p') + if !isdirectory(dir_name) + call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') + return + endif + + if a:0 == 1 + " User specified file pattern + let pat = a:1 + else + " Default file pattern + let pat = '*' + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') + let fcnt = s:Tlist_Process_Dir(dir_name, pat) + + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Add_Files +" Add the specified list of files to the taglist +function! s:Tlist_Add_Files(...) + let flist = '' + let i = 1 + + " Get all the files matching the file patterns supplied as argument + while i <= a:0 + let flist = flist . glob(a:{i}) . "\n" + let i = i + 1 + endwhile + + if flist == '' + call s:Tlist_Warning_Msg('Error: No matching files are found') + return + endif + + let fcnt = s:Tlist_Process_Filelist(flist) + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Extract_Tagtype +" Extract the tag type from the tag text +function! s:Tlist_Extract_Tagtype(tag_line) + " The tag type is after the tag prototype field. The prototype field + " ends with the /;"\t string. We add 4 at the end to skip the characters + " in this special string.. + let start = strridx(a:tag_line, '/;"' . "\t") + 4 + let end = strridx(a:tag_line, 'line:') - 1 + let ttype = strpart(a:tag_line, start, end - start) + + return ttype +endfunction + +" Tlist_Extract_Tag_Scope +" Extract the tag scope from the tag text +function! s:Tlist_Extract_Tag_Scope(tag_line) + let start = strridx(a:tag_line, 'line:') + let end = strridx(a:tag_line, "\t") + if end <= start + return '' + endif + + let tag_scope = strpart(a:tag_line, end + 1) + let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) + + return tag_scope +endfunction + +" Tlist_Refresh() +" Refresh the taglist +function! s:Tlist_Refresh() + call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . + \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') + " If we are entering the buffer from one of the taglist functions, then + " no need to refresh the taglist window again. + if s:Tlist_Skip_Refresh + " We still need to update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif + return + endif + + " If part of the winmanager plugin and not configured to process + " tags always and not configured to display the tags menu, then return + if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always + \ && !g:Tlist_Show_Menu + return + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let tlist_win = bufwinnr(g:TagList_title) + + " If the taglist window is not opened and not configured to process + " tags always and not displaying the tags menu, then return + if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " If the taglist should not be auto updated, then return + if !g:Tlist_Auto_Update + return + endif + endif + + let cur_lnum = line('.') + + if fidx == -1 + " Update the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + else + let mtime = getftime(filename) + if s:tlist_{fidx}_mtime != mtime + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + " Update the taglist and the window + call Tlist_Update_File(filename, ftype) + + " Store the new file modification time + let s:tlist_{fidx}_mtime = mtime + endif + endif + + " Update the taglist window + if tlist_win != -1 + " Disable screen updates + let old_lazyredraw = &lazyredraw + set nolazyredraw + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + endif + + " Update the taglist window + call s:Tlist_Window_Refresh_File(filename, ftype) + + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + + if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx + " If displaying tags for only one file in the taglist + " window and about to display the tags for a new file, + " then center the current tag line for the new file + let center_tag_line = 1 + else + let center_tag_line = 0 + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) + else + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + endif + + " Jump back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + + " Restore screen updates + let &lazyredraw = old_lazyredraw + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Change_Sort() +" Change the sort order of the tag listing +" caller == 'cmd', command used in the taglist window +" caller == 'menu', taglist menu +" action == 'toggle', toggle sort from name to order and vice versa +" action == 'set', set the sort order to sort_type +function! s:Tlist_Change_Sort(caller, action, sort_type) + call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller . + \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')') + if a:caller == 'cmd' + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + elseif a:caller == 'menu' + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + endif + + if a:action == 'toggle' + let sort_type = s:tlist_{fidx}_sort_type + + " Toggle the sort order from 'name' to 'order' and vice versa + if sort_type == 'name' + let s:tlist_{fidx}_sort_type = 'order' + else + let s:tlist_{fidx}_sort_type = 'name' + endif + else + let s:tlist_{fidx}_sort_type = a:sort_type + endif + + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + if a:caller == 'cmd' + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the cursor line before the tag list is sorted + call search(curline, 'w') + + call s:Tlist_Menu_Update_File(1) + else + call s:Tlist_Menu_Remove_File() + + call s:Tlist_Refresh() + endif +endfunction + +" Tlist_Update_Current_File() +" Update taglist for the current buffer by regenerating the tag list +" Contributed by WEN Guopeng. +function! s:Tlist_Update_Current_File() + call s:Tlist_Log_Msg('Tlist_Update_Current_File()') + if winnr() == bufwinnr(g:TagList_title) + " In the taglist window. Update the current file + call s:Tlist_Window_Update_File() + else + " Not in the taglist window. Update the current buffer + let filename = fnamemodify(bufname('%'), ':p') + let fidx = s:Tlist_Get_File_Index(filename) + if fidx != -1 + let s:tlist_{fidx}_valid = 0 + endif + let ft = s:Tlist_Get_Buffer_Filetype('%') + call Tlist_Update_File(filename, ft) + endif +endfunction + +" Tlist_Window_Update_File() +" Update the tags displayed in the taglist window +function! s:Tlist_Window_Update_File() + call s:Tlist_Log_Msg('Tlist_Window_Update_File()') + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + let s:tlist_{fidx}_valid = 0 + + " Update the taglist window + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the tag line before the list is updated + call search(curline, 'w') +endfunction + +" Tlist_Window_Get_Tag_Type_By_Linenum() +" Return the tag type index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + let ftype = s:tlist_{a:fidx}_filetype + + " Determine to which tag type the current line number belongs to using the + " tag type start line number and the number of tags in a tag type + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + let start_lnum = + \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count + if a:lnum >= start_lnum && a:lnum <= end + break + endif + let i = i + 1 + endwhile + + " Current line doesn't belong to any of the displayed tag types + if i > s:tlist_{ftype}_count + return '' + endif + + return ttype +endfunction + +" Tlist_Window_Get_Tag_Index() +" Return the tag index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Index(fidx, lnum) + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) + + " Current line doesn't belong to any of the displayed tag types + if ttype == '' + return 0 + endif + + " Compute the index into the displayed tags for the tag type + let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let tidx = a:lnum - ttype_lnum + if tidx == 0 + return 0 + endif + + " Get the corresponding tag line and return it + return s:tlist_{a:fidx}_{ttype}_{tidx} +endfunction + +" Tlist_Window_Highlight_Line +" Highlight the current line +function! s:Tlist_Window_Highlight_Line() + " Clear previously selected name + match none + + " Highlight the current line + if g:Tlist_Display_Prototype == 0 + let pat = '/\%' . line('.') . 'l\s\+\zs.*/' + else + let pat = '/\%' . line('.') . 'l.*/' + endif + + exe 'match TagListTagName ' . pat +endfunction + +" Tlist_Window_Open_File +" Open the specified file in either a new window or an existing window +" and place the cursor at the specified tag pattern +function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) + call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' . + \ a:win_ctrl . ')') + let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh + let s:Tlist_Skip_Refresh = 1 + + if s:tlist_app_name == "winmanager" + " Let the winmanager edit the file + call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin') + else + + if a:win_ctrl == 'newtab' + " Create a new tab + exe 'tabnew ' . escape(a:filename, ' ') + " Open the taglist window in the new tab + call s:Tlist_Window_Open() + endif + + if a:win_ctrl == 'checktab' + " Check whether the file is present in any of the tabs. + " If the file is present in the current tab, then use the + " current tab. + if bufwinnr(a:filename) != -1 + let file_present_in_tab = 1 + let i = tabpagenr() + else + let i = 1 + let bnum = bufnr(a:filename) + let file_present_in_tab = 0 + while i <= tabpagenr('$') + if index(tabpagebuflist(i), bnum) != -1 + let file_present_in_tab = 1 + break + endif + let i += 1 + endwhile + endif + + if file_present_in_tab + " Goto the tab containing the file + exe 'tabnext ' . i + else + " Open a new tab + exe 'tabnew ' . escape(a:filename, ' ') + + " Open the taglist window + call s:Tlist_Window_Open() + endif + endif + + let winnum = -1 + if a:win_ctrl == 'prevwin' + " Open the file in the previous window, if it is usable + let cur_win = winnr() + wincmd p + if &buftype == '' && !&previewwindow + exe "edit " . escape(a:filename, ' ') + let winnum = winnr() + else + " Previous window is not usable + exe cur_win . 'wincmd w' + endif + endif + + " Goto the window containing the file. If the window is not there, open a + " new window + if winnum == -1 + let winnum = bufwinnr(a:filename) + endif + + if winnum == -1 + " Locate the previously used window for opening a file + let fwin_num = 0 + let first_usable_win = 0 + + let i = 1 + let bnum = winbufnr(i) + while bnum != -1 + if getwinvar(i, 'tlist_file_window') == 'yes' + let fwin_num = i + break + endif + if first_usable_win == 0 && + \ getbufvar(bnum, '&buftype') == '' && + \ !getwinvar(i, '&previewwindow') + " First non-taglist, non-plugin and non-preview window + let first_usable_win = i + endif + let i = i + 1 + let bnum = winbufnr(i) + endwhile + + " If a previously used window is not found, then use the first + " non-taglist window + if fwin_num == 0 + let fwin_num = first_usable_win + endif + + if fwin_num != 0 + " Jump to the file window + exe fwin_num . "wincmd w" + + " If the user asked to jump to the tag in a new window, then split + " the existing window into two. + if a:win_ctrl == 'newwin' + split + endif + exe "edit " . escape(a:filename, ' ') + else + " Open a new window + if g:Tlist_Use_Horiz_Window + exe 'leftabove split ' . escape(a:filename, ' ') + else + if winbufnr(2) == -1 + " Only the taglist window is present + if g:Tlist_Use_Right_Window + exe 'leftabove vertical split ' . + \ escape(a:filename, ' ') + else + exe 'rightbelow vertical split ' . + \ escape(a:filename, ' ') + endif + + " Go to the taglist window to change the window size to + " the user configured value + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vertical resize ' . g:Tlist_WinWidth + endif + " Go back to the file window + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + else + " A plugin or help window is also present + wincmd w + exe 'leftabove split ' . escape(a:filename, ' ') + endif + endif + endif + " Mark the window, so that it can be reused. + call s:Tlist_Window_Mark_File_Window() + else + if v:version >= 700 + " If the file is opened in more than one window, then check + " whether the last accessed window has the selected file. + " If it does, then use that window. + let lastwin_bufnum = winbufnr(winnr('#')) + if bufnr(a:filename) == lastwin_bufnum + let winnum = winnr('#') + endif + endif + exe winnum . 'wincmd w' + + " If the user asked to jump to the tag in a new window, then split the + " existing window into two. + if a:win_ctrl == 'newwin' + split + endif + endif + endif + + " Jump to the tag + if a:tagpat != '' + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + silent call search(a:tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif + endif + + " If the user selects to preview the tag then jump back to the + " taglist window + if a:win_ctrl == 'preview' + " Go back to the taglist window + let winnum = bufwinnr(g:TagList_title) + exe winnum . 'wincmd w' + else + " If the user has selected to close the taglist window, when a + " tag is selected, close the taglist window + if g:Tlist_Close_On_Select + call s:Tlist_Window_Goto_Window() + close + + " Go back to the window displaying the selected file + let wnum = bufwinnr(a:filename) + if wnum != -1 && wnum != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') + endif + endif + endif + + let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh +endfunction + +" Tlist_Window_Jump_To_Tag() +" Jump to the location of the current tag +" win_ctrl == useopen - Reuse the existing file window +" win_ctrl == newwin - Open a new window +" win_ctrl == preview - Preview the tag +" win_ctrl == prevwin - Open in previous window +" win_ctrl == newtab - Open in new tab +function! s:Tlist_Window_Jump_To_Tag(win_ctrl) + call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')') + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a closed fold, then use the first line of the fold + " and jump to the file. + let lnum = foldclosed('.') + if lnum == -1 + " Jump to the selected tag or file + let lnum = line('.') + else + " Open the closed fold + .foldopen! + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + " Get the tag output for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx != 0 + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) + + " Highlight the tagline + call s:Tlist_Window_Highlight_Line() + else + " Selected a line which is not a tag name. Just edit the file + let tagpat = '' + endif + + call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) +endfunction + +" Tlist_Window_Show_Info() +" Display information about the entry under the cursor +function! s:Tlist_Window_Show_Info() + call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') + + " Clear the previously displayed line + echo + + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a fold, then don't display the prototype + if foldclosed('.') != -1 + return + endif + + let lnum = line('.') + + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + if lnum == s:tlist_{fidx}_start + " Cursor is on a file name + let fname = s:tlist_{fidx}_filename + if strlen(fname) > 50 + let fname = fnamemodify(fname, ':t') + endif + echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . + \ ', Tag count=' . s:tlist_{fidx}_tag_count + return + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx == 0 + " Cursor is on a tag type + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + if ttype == '' + return + endif + + let ttype_name = '' + + let ftype = s:tlist_{fidx}_filetype + let i = 1 + while i <= s:tlist_{ftype}_count + if ttype == s:tlist_{ftype}_{i}_name + let ttype_name = s:tlist_{ftype}_{i}_fullname + break + endif + let i = i + 1 + endwhile + + echo 'Tag type=' . ttype_name . + \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count + return + endif + + " Get the tag search pattern and display it + echo s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Find_Nearest_Tag_Idx +" Find the tag idx nearest to the supplied line number +" Returns -1, if a tag couldn't be found for the specified line number +function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) + let sort_type = s:tlist_{a:fidx}_sort_type + + let left = 1 + let right = s:tlist_{a:fidx}_tag_count + + if sort_type == 'order' + " Tags sorted by order, use a binary search. + " The idea behind this function is taken from the ctags.vim script (by + " Alexey Marinichev) available at the Vim online website. + + " If the current line is the less than the first tag, then no need to + " search + let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) + + if a:linenum < first_lnum + return -1 + endif + + while left < right + let middle = (right + left + 1) / 2 + let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) + + if middle_lnum == a:linenum + let left = middle + break + endif + + if middle_lnum > a:linenum + let right = middle - 1 + else + let left = middle + endif + endwhile + else + " Tags sorted by name, use a linear search. (contributed by Dave + " Eggum). + " Look for a tag with a line number less than or equal to the supplied + " line number. If multiple tags are found, then use the tag with the + " line number closest to the supplied line number. IOW, use the tag + " with the highest line number. + let closest_lnum = 0 + let final_left = 0 + while left <= right + let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) + + if lnum < a:linenum && lnum > closest_lnum + let closest_lnum = lnum + let final_left = left + elseif lnum == a:linenum + let closest_lnum = lnum + let final_left = left + break + else + let left = left + 1 + endif + endwhile + if closest_lnum == 0 + return -1 + endif + if left >= right + let left = final_left + endif + endif + + return left +endfunction + +" Tlist_Window_Highlight_Tag() +" Highlight the current tag +" cntx == 1, Called by the taglist plugin itself +" cntx == 2, Forced by the user through the TlistHighlightTag command +" center = 1, move the tag line to the center of the taglist window +function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center) + " Highlight the current tag only if the user configured the + " taglist plugin to do so or if the user explictly invoked the + " command to highlight the current tag. + if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 + return + endif + + if a:filename == '' + return + endif + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + return + endif + + " If the file is currently not displayed in the taglist window, then retrn + if !s:tlist_{fidx}_visible + return + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return + endif + + " Ignore all autocommands + let old_ei = &eventignore + set eventignore=all + + " Save the original window number + let org_winnr = winnr() + + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + " Go to the taglist window + if !in_taglist_window + exe winnum . 'wincmd w' + endif + + " Clear previously selected name + match none + + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) + if tidx == -1 + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + let lnum = line('.') + + if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end + " Move the cursor to the beginning of the file + exe s:tlist_{fidx}_start + endif + + if foldclosed('.') != -1 + .foldopen + endif + + call winline() + + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return + endif + + " Extract the tag type + let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + + " Compute the line number + " Start of file + Start of tag type + offset + let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + + \ s:tlist_{fidx}_{tidx}_ttype_idx + + " Goto the line containing the tag + exe lnum + + " Open the fold + if foldclosed('.') != -1 + .foldopen + endif + + if a:center + " Move the tag line to the center of the taglist window + normal! z. + else + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + call winline() + endif + + " Highlight the tag name + call s:Tlist_Window_Highlight_Line() + + " Go back to the original window + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return +endfunction + +" Tlist_Get_Tag_Prototype_By_Line +" Get the prototype for the tag on or before the specified line number in the +" current buffer +function! Tlist_Get_Tag_Prototype_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . + \ '' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Expand the file to a fully qualified name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag text using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Get_Tagname_By_Line +" Get the tag name on or before the specified line number in the +" current buffer +function! Tlist_Get_Tagname_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tagname_By_Line ' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Make sure the current file has a name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag name using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:tlist_{fidx}_{tidx}_tag_name +endfunction + +" Tlist_Window_Move_To_File +" Move the cursor to the beginning of the current file or the next file +" or the previous file in the taglist window +" dir == -1, move to start of current or previous function +" dir == 1, move to start of next function +function! s:Tlist_Window_Move_To_File(dir) + if foldlevel('.') == 0 + " Cursor is on a non-folded line (it is not in any of the files) + " Move it to a folded line + if a:dir == -1 + normal! zk + else + " While moving down to the start of the next fold, + " no need to do go to the start of the next file. + normal! zj + return + endif + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + let cur_lnum = line('.') + + if a:dir == -1 + if cur_lnum > s:tlist_{fidx}_start + " Move to the beginning of the current file + exe s:tlist_{fidx}_start + return + endif + + if fidx != 0 + " Move to the beginning of the previous file + let fidx = fidx - 1 + else + " Cursor is at the first file, wrap around to the last file + let fidx = s:tlist_file_count - 1 + endif + + exe s:tlist_{fidx}_start + return + else + " Move to the beginning of the next file + let fidx = fidx + 1 + + if fidx >= s:tlist_file_count + " Cursor is at the last file, wrap around to the first file + let fidx = 0 + endif + + if s:tlist_{fidx}_start != 0 + exe s:tlist_{fidx}_start + endif + return + endif +endfunction + +" Tlist_Session_Load +" Load a taglist session (information about all the displayed files +" and the tags) from the specified file +function! s:Tlist_Session_Load(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') + return + endif + + let sessionfile = a:1 + + if !filereadable(sessionfile) + let msg = 'Taglist: Error - Unable to open file ' . sessionfile + call s:Tlist_Warning_Msg(msg) + return + endif + + " Mark the current window as the file window + call s:Tlist_Window_Mark_File_Window() + + " Source the session file + exe 'source ' . sessionfile + + let new_file_count = g:tlist_file_count + unlet! g:tlist_file_count + + let i = 0 + while i < new_file_count + let ftype = g:tlist_{i}_filetype + unlet! g:tlist_{i}_filetype + + if !exists('s:tlist_' . ftype . '_count') + if s:Tlist_FileType_Init(ftype) == 0 + let i = i + 1 + continue + endif + endif + + let fname = g:tlist_{i}_filename + unlet! g:tlist_{i}_filename + + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + let s:tlist_{fidx}_visible = 0 + let i = i + 1 + continue + else + " As we are loading the tags from the session file, if this + " file was previously deleted by the user, now we need to + " add it back. So remove the file from the deleted list. + call s:Tlist_Update_Remove_List(fname, 0) + endif + + let fidx = s:Tlist_Init_File(fname, ftype) + + let s:tlist_{fidx}_filename = fname + + let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type + unlet! g:tlist_{i}_sort_type + + let s:tlist_{fidx}_filetype = ftype + let s:tlist_{fidx}_mtime = getftime(fname) + + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + + let s:tlist_{fidx}_valid = 1 + + let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count + unlet! g:tlist_{i}_tag_count + + let j = 1 + while j <= s:tlist_{fidx}_tag_count + let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag + let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name + let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx + unlet! g:tlist_{i}_{j}_tag + unlet! g:tlist_{i}_{j}_tag_name + unlet! g:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + + if exists('g:tlist_' . i . '_' . ttype) + let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} + unlet! g:tlist_{i}_{ttype} + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count + unlet! g:tlist_{i}_{ttype}_count + + let k = 1 + while k <= s:tlist_{fidx}_{ttype}_count + let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} + unlet! g:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + else + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + endif + + let j = j + 1 + endwhile + + let i = i + 1 + endwhile + + " If the taglist window is open, then update it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() + + " Go back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Session_Save +" Save a taglist session (information about all the displayed files +" and the tags) into the specified file +function! s:Tlist_Session_Save(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') + return + endif + + let sessionfile = a:1 + + if s:tlist_file_count == 0 + " There is nothing to save + call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') + return + endif + + if filereadable(sessionfile) + let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') + if ans !=? 'y' + return + endif + + echo "\n" + endif + + let old_verbose = &verbose + set verbose&vim + + exe 'redir! > ' . sessionfile + + silent! echo '" Taglist session file. This file is auto-generated.' + silent! echo '" File information' + silent! echo 'let tlist_file_count = ' . s:tlist_file_count + + let i = 0 + + while i < s:tlist_file_count + " Store information about the file + silent! echo 'let tlist_' . i . "_filename = '" . + \ s:tlist_{i}_filename . "'" + silent! echo 'let tlist_' . i . '_sort_type = "' . + \ s:tlist_{i}_sort_type . '"' + silent! echo 'let tlist_' . i . '_filetype = "' . + \ s:tlist_{i}_filetype . '"' + silent! echo 'let tlist_' . i . '_tag_count = ' . + \ s:tlist_{i}_tag_count + " Store information about all the tags + let j = 1 + while j <= s:tlist_{i}_tag_count + let txt = escape(s:tlist_{i}_{j}_tag, '"\\') + silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' + silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . + \ s:tlist_{i}_{j}_tag_name . '"' + silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . + \ s:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + " Store information about all the tags grouped by their type + let ftype = s:tlist_{i}_filetype + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{i}_{ttype}_count != 0 + let txt = escape(s:tlist_{i}_{ttype}, '"\') + let txt = substitute(txt, "\n", "\\\\n", 'g') + silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . + \ txt . '"' + silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . + \ s:tlist_{i}_{ttype}_count + let k = 1 + while k <= s:tlist_{i}_{ttype}_count + silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . + \ ' = ' . s:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + endif + let j = j + 1 + endwhile + + silent! echo + + let i = i + 1 + endwhile + + redir END + + let &verbose = old_verbose +endfunction + +" Tlist_Buffer_Removed +" A buffer is removed from the Vim buffer list. Remove the tags defined +" for that file +function! s:Tlist_Buffer_Removed(filename) + call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')') + + " Make sure a valid filename is supplied + if a:filename == '' + return + endif + + " Get tag list index of the specified file + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " File not present in the taglist + return + endif + + " Remove the file from the list + call s:Tlist_Remove_File(fidx, 0) +endfunction + +" When a buffer is deleted, remove the file from the taglist +autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) + +" Tlist_Window_Open_File_Fold +" Open the fold for the specified file and close the fold for all the +" other files +function! s:Tlist_Window_Open_File_Fold(acmd_bufnr) + call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_bufnr . ')') + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') + return + endif + + " Save the original window number + let org_winnr = winnr() + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + if in_taglist_window + " When entering the taglist window, no need to update the folds + return + endif + + " Go to the taglist window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + + " Close all the folds + silent! %foldclose + + " Get tag list index of the specified file + let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p') + if filereadable(fname) + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen" + endif + endif + + " Go back to the original window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') + endif +endfunction + +" Tlist_Window_Check_Auto_Open +" Open the taglist window automatically on Vim startup. +" Open the window only when files present in any of the Vim windows support +" tags. +function! s:Tlist_Window_Check_Auto_Open() + let open_window = 0 + + let i = 1 + let buf_num = winbufnr(i) + while buf_num != -1 + let filename = fnamemodify(bufname(buf_num), ':p') + let ft = s:Tlist_Get_Buffer_Filetype(buf_num) + if !s:Tlist_Skip_File(filename, ft) + let open_window = 1 + break + endif + let i = i + 1 + let buf_num = winbufnr(i) + endwhile + + if open_window + call s:Tlist_Window_Toggle() + endif +endfunction + +" Tlist_Refresh_Folds +" Remove and create the folds for all the files displayed in the taglist +" window. Used after entering a tab. If this is not done, then the folds +" are not properly created for taglist windows displayed in multiple tabs. +function! s:Tlist_Refresh_Folds() + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + return + endif + + let save_wnum = winnr() + exe winnum . 'wincmd w' + + " First remove all the existing folds + normal! zE + + " Create the folds for each in the tag list + let fidx = 0 + while fidx < s:tlist_file_count + let ftype = s:tlist_{fidx}_filetype + + " Create the folds for each tag type in a file + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{fidx}_{ttype}_count + let s = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + let e = s + s:tlist_{fidx}_{ttype}_count + exe s . ',' . e . 'fold' + endif + let j = j + 1 + endwhile + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + let fidx = fidx + 1 + endwhile + + exe save_wnum . 'wincmd w' +endfunction + +function! s:Tlist_Menu_Add_Base_Menu() + call s:Tlist_Log_Msg('Adding the base menu') + + " Add the menu + anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() + anoremenu T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu T&ags.-SEP1- : + + if &mousemodel =~ 'popup' + anoremenu PopUp.T&ags.Refresh\ menu + \ :call Tlist_Menu_Refresh() + anoremenu PopUp.T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu PopUp.T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu PopUp.T&ags.-SEP1- : + endif +endfunction + +let s:menu_char_prefix = + \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + +" Tlist_Menu_Get_Tag_Type_Cmd +" Get the menu command for the specified tag type +" fidx - File type index +" ftype - File Type +" add_ttype_name - To add or not to add the tag type name to the menu entries +" ttype_idx - Tag type index +function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx) + " Curly brace variable name optimization + let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx + + let ttype = s:tlist_{ftype_ttype_idx}_name + if a:add_ttype_name + " If the tag type name contains space characters, escape it. This + " will be used to create the menu entries. + let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') + endif + + " Curly brace variable name optimization + let fidx_ttype = a:fidx . '_' . ttype + + " Number of tag entries for this tag type + let tcnt = s:tlist_{fidx_ttype}_count + if tcnt == 0 " No entries for this tag type + return '' + endif + + let mcmd = '' + + " Create the menu items for the tags. + " Depending on the number of tags of this type, split the menu into + " multiple sub-menus, if needed. + if tcnt > g:Tlist_Max_Submenu_Items + let j = 1 + while j <= tcnt + let final_index = j + g:Tlist_Max_Submenu_Items - 1 + if final_index > tcnt + let final_index = tcnt + endif + + " Extract the first and last tag name and form the + " sub-menu name + let tidx = s:tlist_{fidx_ttype}_{j} + let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + let tidx = s:tlist_{fidx_ttype}_{final_index} + let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + " Truncate the names, if they are greater than the + " max length + let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) + let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) + + " Form the menu command prefix + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.' + + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + while j <= final_index + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . + \ tidx . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endwhile + else + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let j = 1 + while j <= tcnt + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx + \ . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endif + + return mcmd +endfunction + +" Update the taglist menu with the tags for the specified file +function! s:Tlist_Menu_File_Refresh(fidx) + call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) + " The 'B' flag is needed in the 'cpoptions' option + let old_cpoptions = &cpoptions + set cpoptions&vim + + exe s:tlist_{a:fidx}_menu_cmd + + " Update the popup menu (if enabled) + if &mousemodel =~ 'popup' + let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', + \ ' PopUp.T\\\&ags.', "g") + exe cmd + endif + + " The taglist menu is not empty now + let s:tlist_menu_empty = 0 + + " Restore the 'cpoptions' settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Menu_Update_File +" Add the taglist menu +function! s:Tlist_Menu_Update_File(clear_menu) + if !has('gui_running') + " Not running in GUI mode + return + endif + + call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) + + " Remove the tags menu + if a:clear_menu + call s:Tlist_Menu_Remove_File() + + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 || !s:tlist_{fidx}_valid + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " Process the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + if fidx == -1 + return + endif + endif + + let fname = escape(fnamemodify(bufname('%'), ':t'), '.') + if fname != '' + exe 'anoremenu T&ags.' . fname . ' ' + anoremenu T&ags.-SEP2- : + endif + + if !s:tlist_{fidx}_tag_count + return + endif + + if s:tlist_{fidx}_menu_cmd != '' + " Update the menu with the cached command + call s:Tlist_Menu_File_Refresh(fidx) + + return + endif + + " We are going to add entries to the tags menu, so the menu won't be + " empty + let s:tlist_menu_empty = 0 + + let cmd = '' + + " Determine whether the tag type name needs to be added to the menu + " If more than one tag type is present in the taglisting for a file, + " then the tag type name needs to be present + let add_ttype_name = -1 + let i = 1 + while i <= s:tlist_{ftype}_count && add_ttype_name < 1 + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{fidx}_{ttype}_count + let add_ttype_name = add_ttype_name + 1 + endif + let i = i + 1 + endwhile + + " Process the tags by the tag type and get the menu command + let i = 1 + while i <= s:tlist_{ftype}_count + let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i) + if mcmd != '' + let cmd = cmd . mcmd + endif + + let i = i + 1 + endwhile + + " Cache the menu command for reuse + let s:tlist_{fidx}_menu_cmd = cmd + + " Update the menu + call s:Tlist_Menu_File_Refresh(fidx) +endfunction + +" Tlist_Menu_Remove_File +" Remove the tags displayed in the tags menu +function! s:Tlist_Menu_Remove_File() + if !has('gui_running') || s:tlist_menu_empty + return + endif + + call s:Tlist_Log_Msg('Removing the tags menu for a file') + + " Cleanup the Tags menu + silent! unmenu T&ags + if &mousemodel =~ 'popup' + silent! unmenu PopUp.T&ags + endif + + " Add a dummy menu item to retain teared off menu + noremenu T&ags.Dummy l + + silent! unmenu! T&ags + if &mousemodel =~ 'popup' + silent! unmenu! PopUp.T&ags + endif + + call s:Tlist_Menu_Add_Base_Menu() + + " Remove the dummy menu item + unmenu T&ags.Dummy + + let s:tlist_menu_empty = 1 +endfunction + +" Tlist_Menu_Refresh +" Refresh the taglist menu +function! s:Tlist_Menu_Refresh() + call s:Tlist_Log_Msg('Refreshing the tags menu') + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx != -1 + " Invalidate the cached menu command + let s:tlist_{fidx}_menu_cmd = '' + endif + + " Update the taglist, menu and window + call s:Tlist_Update_Current_File() +endfunction + +" Tlist_Menu_Jump_To_Tag +" Jump to the selected tag +function! s:Tlist_Menu_Jump_To_Tag(tidx) + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) + if tagpat == '' + return + endif + + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + + silent call search(tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif +endfunction + +" Tlist_Menu_Init +" Initialize the taglist menu +function! s:Tlist_Menu_Init() + call s:Tlist_Menu_Add_Base_Menu() + + " Automatically add the tags defined in the current file to the menu + augroup TagListMenuCmds + autocmd! + + if !g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + autocmd BufLeave * call s:Tlist_Menu_Remove_File() + augroup end + + call s:Tlist_Menu_Update_File(0) +endfunction + +" Tlist_Vim_Session_Load +" Initialize the taglist window/buffer, which is created when loading +" a Vim session file. +function! s:Tlist_Vim_Session_Load() + call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') + + " Initialize the taglist window + call s:Tlist_Window_Init() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() +endfunction + +" Tlist_Set_App +" Set the name of the external plugin/application to which taglist +" belongs. +" Taglist plugin is part of another plugin like cream or winmanager. +function! Tlist_Set_App(name) + if a:name == "" + return + endif + + let s:tlist_app_name = a:name +endfunction + +" Winmanager integration + +" Initialization required for integration with winmanager +function! TagList_Start() + " If current buffer is not taglist buffer, then don't proceed + if bufname('%') != '__Tag_List__' + return + endif + + call Tlist_Set_App('winmanager') + + " Get the current filename from the winmanager plugin + let bufnum = WinManagerGetLastEditedFile() + if bufnum != -1 + let filename = fnamemodify(bufname(bufnum), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(bufnum) + endif + + " Initialize the taglist window, if it is not already initialized + if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized + call s:Tlist_Window_Init() + call s:Tlist_Window_Refresh() + let s:tlist_window_initialized = 1 + endif + + " Update the taglist window + if bufnum != -1 + if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update + call s:Tlist_Window_Refresh_File(filename, ftype) + endif + endif +endfunction + +function! TagList_IsValid() + return 0 +endfunction + +function! TagList_WrapUp() + return 0 +endfunction + +" restore 'cpo' +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/plugin/txt.vim b/plugin/txt.vim new file mode 100644 index 00000000..e3701283 --- /dev/null +++ b/plugin/txt.vim @@ -0,0 +1,115 @@ +" Vim universal .txt syntax file +" Language: txt 1.2 +" Maintainer: Tomasz Kalkosiński +" Last change: 3 Jan 2007 +" +" This is an universal syntax script for all text documents, logs, changelogs, readmes +" and all other strange and undetected filetypes. +" The goal is to keep it very simple. It colors numbers, operators, signs, +" cites, brackets, delimiters, comments, TODOs, errors, debug, changelog tags +" and basic smileys ;] +" +" Changelog: +" 1.2 (03-01-2007) +" Add: Changelog tags: add, chg, fix, rem, del linked with Keyword +" Add: note to txtTodo group +" +" 1.1 (01-07-2006) Add: International cites +" Chg: txtString color to Normal +" Chg: Simplified number coloring working better now +" +" 1.0 (28-04-2006) Initial upload +" +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn case ignore + +syn cluster txtAlwaysContains add=txtTodo,txtError + +syn cluster txtContains add=txtNumber,txtOperator,txtLink + +syn match txtOperator "[~\-_+*<>\[\]{}=|#@$%&\\/:&\^\.,!?]" + +" Common strings +syn match txtString "[[:alpha:]]" contains=txtOperator + +" Numbers +"syn match txtNumber "\d\(\.\d\+\)\?" +syn match txtNumber "\d" + +" Cites +syn region txtCite matchgroup=txtOperator start="\"" end="\"" contains=@txtContains,@txtAlwaysContains + +" utf8 international cites: +" ‚ ’ U+201A (8218), U+2019 (8217) Polish single quotation +" „ ” U+201E (8222), U+201d (8221) Polish double quotation +" « » U+00AB (171), U+00BB (187) French quotes +" ‘ ’ U+2018 (8216), U+2019 (8217) British quotes +" „ “ U+201E (8222), U+2019 (8217) German quotes +" ‹ › U+2039 (8249), U+203A (8250) French quotes +syn region txtCite matchgroup=txtOperator start="[‚„«‘„‹]" end="[’”»’“›]" contains=@txtContains,@txtAlwaysContains + +syn region txtCite matchgroup=txtOperator start="\(\s\|^\)\@<='" end="'" contains=@txtContains,@txtAlwaysContains + +" Comments +syn region txtComment start="(" end=")" contains=@txtContains,txtCite,@txtAlwaysContains +syn region txtComments matchgroup=txtComments start="\/\/" end="$" contains=@txtAlwaysContains oneline +syn region txtComments start="\/\*" end="\*\/" contains=@txtAlwaysContains + +syn region txtDelims matchgroup=txtOperator start="<" end=">" contains=@txtContains,@txtAlwaysContains oneline +syn region txtDelims matchgroup=txtOperator start="{" end="}" contains=@txtContains,@txtAlwaysContains oneline +syn region txtDelims matchgroup=txtOperator start="\[" end="\]" contains=@txtContains,@txtAlwaysContains oneline + +syn match txtLink "\(http\|https\|ftp\)\(\w\|[\-&=,?\:\.\/]\)*" contains=txtOperator + +" Basic smileys +syn match txtSmile "[:;=8][\-]\?\([(\/\\)\[\]]\+\|[OoPpDdFf]\+\)" + +" Changelog tags: add, chg, rem, fix +syn match txtChangelogs "\\s*:" contains=txtOperator +syn match txtChangelogs "\\s*:" contains=txtOperator +syn match txtChangelogs "\\s*:" contains=txtOperator +syn match txtChangelogs "\\s*:" contains=txtOperator +syn match txtChangelogs "\\s*:" contains=txtOperator + +syn keyword txtTodo todo fixme xxx note + +syn keyword txtError error bug + +syn keyword txtDebug debug + +syn case match + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet + if version < 508 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink txtNumber Number + HiLink txtString Normal + HiLink txtOperator Operator + HiLink txtCite String + HiLink txtComments Comment + HiLink txtComment Comment + HiLink txtDelims Delimiter + HiLink txtLink Special + HiLink txtSmile PreProc + HiLink txtError Error + HiLink txtTodo Todo + HiLink txtDebug Debug + HiLink txtChangelogs Keyword + + delcommand HiLink + +let b:current_syntax = "txt" +" vim: ts=8 diff --git a/plugin/vimim.cjk.txt b/plugin/vimim.cjk.txt new file mode 100644 index 00000000..2e5b669b --- /dev/null +++ b/plugin/vimim.cjk.txt @@ -0,0 +1,20902 @@ +一 1000 yi1 u one 7 +丁 1020 ding1 944 +丂 1002 kao3qiao3 +七 4071 qi1 seven 496 +丄 2010 shang4 +丅 1020 xia4 +丆 1020 myeone +万萬 1022 wan4 238 +丈 5000 zhang4 1179 +三 1010 san1 three 92 +上 2110 shang4 up 11 +下 1023 xia4 down 27 +丌 1022 ji1 +不 1090 bu4 no not 5 +与與 2112 yu3yu4yu2 71 +丏 1002 mian3 +丐 1002 gai4 2874 +丑醜 1710 chou3 ugly 1725 +丒 1710 chou3 +专專 5030 zhuan1 576 +且 7710 qie3ju1 290 +丕 1010 pi1 3797 +世 4471 shi4 213 +丗 4477 shi4 +丘 7210 qiu1 1905 +丙 1022 bing3 2818 +业業 3210 ye4 310 +丛叢 8810 cong2 1738 +东東 4090 dong1 east 206 +丝絲 2210 si1 silk 878 +丞 1710 cheng2 3183 +丟丢 1073 diu1 +丠 1210 qiu1 +両 1022 liang3liang4 +丢丟 2073 diu1 1259 +丣 1077 you3 +两兩 1022 liang3 79 +严嚴 1020 yan2 468 +並并 8010 bing4 +丧喪 4073 sang1sang4 die 1450 +丨 2000 gun3 u +丩 2270 jiu1 +个個 8020 ge4 8 +丫 8020 ya1 2263 +丬 3210 qiang2 +中 5000 zhong1zhong4 12 +丮 1751 ji3 +丯 5000 jie4 +丰豐 5000 feng1 1141 +丱 2277 guan4 +串 5000 chuan4 bunch 1578 +丳 5500 chan3 +临臨 2806 lin2 777 +丵 3240 zhuo3 +丶 3000 zhu3 u +丷 8000 ba1 +丸 5001 wan2 2489 +丹 7744 dan1 1124 +为為 3402 wei4 14 +主 0010 zhu3 84 +丼 5500 jing3 +丽麗 1022 li4 beautiful 751 +举舉 9050 ju3 411 +丿 2000 pie3 u +乀 7003 fu2 +乁 1703 yi2 +乂 4000 yi4 +乃 1722 nai3 1052 +乄 4020 wu3 +久 2780 jiu3 486 +乆 2800 jiu3 +乇 2071 zhe2 +么 2073 me5mo3 140 +义義 4000 yi4 282 +乊 2032 ho1 +之 3030 zhi1 of 43 +乌烏 2712 wu1wu4 1251 +乍 8021 zha4zuo4 2573 +乎 2040 hu1hu2 441 +乏 2030 fa2 1542 +乐樂 7290 le4yue4 music happy 426 +乑 2090 yin1 +乒 7220 ping1 3117 +乓 7203 pang1 3125 +乔喬 2022 qiao2 1372 +乕 7222 hu3 +乖 2011 guai1 2308 +乗 2090 cheng2sheng4 +乘 2090 cheng2sheng4 ride 1079 +乙 1771 yi3 u 2094 +乚 2071 yin3 +乛 1700 zhe2 +乜 4771 mie1nie4 +九 4001 jiu3 nine 469 +乞 8071 qi3 2091 +也 4471 ye3 also 30 +习習 1712 xi2 706 +乡鄉 2020 xiang1 village 810 +乢 2271 gai4 +乣 2271 jiu3 +乤 1071 ha1 +乥 2071 ho1lo1 +书書 5302 shu1 book 220 +乧 3471 dou1 +乨 2261 shi3 +乩 2261 ji1 +乪 1671 nang2 +乫 4671 jia1 +乬 7171 guo4 +乭 1071 shi2 +乮 7771 korean +乯 1071 korean +买買 1780 mai3 buy 659 +乱亂 2261 luan4 627 +乲 3771 korean +乳 2241 ru3 breast 2138 +乴 5271 xue2 +乵 0241 yan3 +乶 5371 fu3 +乷 3971 sha1 +乸 4771 na3 +乹 4241 gan1qian2 +乺 7271 sao1 +乻 0871 er1 +乼 3071 cui1 +乽 4471 za1 +乾干 4841 gan1qian2 2153 +乿 2291 chi4 +亀 2771 gui1 +亁 4841 gan1 +亂乱 2221 luan4 +亃 9221 lin2 +亄 4211 yi4 +亅 2000 jue2 u +了 1720 liao3le5 4 +亇 2720 ma1 +予 1720 yu2yu3 1185 +争爭 2750 zheng1 531 +亊 5000 shi4 +事 5000 shi4 54 +二 1010 er4 u two 135 +亍 1020 chu4 +于於 1040 yu2 41 +亏虧 1002 kui1 deficit 1387 +亐 1002 yu2 +云雲 1073 yun2 cloud 418 +互 1010 hu4 922 +亓 1022 qi2 +五 1010 wu3 five 247 +井 5500 jing3 well 1415 +亖 1010 si4 +亗 2210 sui4 +亘 1010 gen4geng4 3646 +亙 1010 gen4geng4 +亚亞 1010 ya4 847 +些 2210 xie1suo4 101 +亜 1010 ya4 +亝 2310 qi2zhai1zi1 +亞亚 1010 ya4 +亟 1010 ji2qi4 3093 +亠 0000 tou2 u +亡 0071 wang2wu2 die 1114 +亢 0021 kang4 3365 +亣 0022 ta4 +交 0040 jiao1 230 +亥 0080 hai4 3317 +亦 0033 yi4 986 +产產 0020 chan3 yield 453 +亨 0020 heng1peng1 2727 +亩畝 0060 mu3 2266 +亪 0003 ye4 +享 0040 xiang3 1133 +京 0090 jing1 527 +亭 0020 ting2 1509 +亮 0021 liang4 683 +亯 0060 xiang3 +亰 0090 jing1 +亱 0021 ye4 +亲親 0090 qin1qing4 347 +亳 0071 bo2 +亴 0041 you4 +亵褻 0073 xie4 3625 +亶 0010 dan3dan4 +亷 0023 lian2 +亸嚲 0845 duo3 +亹 0010 wei3men2 +人 8000 ren2 u man person 9 +亻 2020 ren2 +亼 8010 ji2 +亽 8030 ji1 +亾 2871 wang2wu2 +亿億 2721 yi4 1769 +什 2420 shi2shen2 243 +仁 2121 ren2 942 +仂 2422 le4 +仃 2122 ding1 +仄 7128 ze4 +仅僅 2724 jin3jin4 754 +仆僕 2320 pu1pu2 1709 +仇 2421 chou2qiu2 1577 +仈 2820 ba1 +仉 2721 zhang3 +今 8020 jin1 178 +介 8022 jie4 893 +仌 8080 bing1 +仍 2722 reng2 529 +从從 8800 cong2zong4 from 81 +仏 2223 fo2 +仐 8040 san3 +仑侖 8071 lun2 2635 +仒 8030 bing1 +仓倉 8071 cang1 1777 +仔 2724 zi3zai3 1573 +仕 2421 shi4 2763 +他 2421 ta1 him he 35 +仗 2520 zhang4 1953 +付 2420 fu4 863 +仙 2227 xian1 immortal 1233 +仚 8077 xian1 +仛 2221 tuo1 +仜 2121 hong2 +仝 8010 tong2tong4 +仞 2722 ren4 +仟 2224 qian1 thousand +仠 2124 gan2 +仡 2821 yi4ge1 +仢 2722 di2 +代 2324 dai4 221 +令 8030 ling4 351 +以 2870 yi3 20 +仦 2920 chao4 +仧 2180 chang2zhang3 +仨 2121 sa1 +仩 2121 chang2 +仪儀 2420 yi2 1246 +仫 2223 mu4 +们們 2722 men2 24 +仭 2725 ren4 +仮 2224 fan3 +仯 2922 chao4 +仰 2722 yang3ang2 1425 +仱 2822 qian2 +仲 2520 zhong4 1300 +仳 2221 pi3pi2 +仴 2722 wan4 +仵 2824 wu3 +件 2520 jian4 piece 192 +价價 2822 jia4 667 +仸 2228 yao3 +仹 2520 feng1 +仺 8071 cang1 +任 2221 ren4ren2 205 +仼 2121 wang2 +份 2822 fen4bin1 844 +仾 2121 di1 +仿 2022 fang3 1109 +伀 2823 zhong1 +企 8010 qi3 1261 +伂 2522 pei4 +伃 2722 yu2 +伄 2722 diao4 +伅 2521 dun4 +伆 2722 wen4 +伇 2724 yi4 +伈 2320 xin3 +伉 2021 kang4 +伊 2720 yi1 1230 +伋 2724 ji2 +伌 2121 ai4 +伍 2121 wu3 five 1412 +伎 2424 ji4qi2 3672 +伏 2328 fu2 1389 +伐 2325 fa2 1791 +休 2429 xiu1 926 +伒 2222 jin4 +伓 2129 bei1 +伔 2721 dan3shen3 +伕 2528 fu1 +伖 2424 tang3 +众眾 8088 zhong4 374 +优優 2321 you1 874 +伙 2928 huo3 904 +会會 8073 hui4kuai4 can 36 +伛傴 2121 yu3 +伜 2424 cui4 +伝 2123 chuan2yun2 +伞傘 8040 san3 umbrella 2680 +伟偉 2522 wei3 1175 +传傳 2523 chuan2zhuan4 biography 272 +伡 2425 che1 +伢 2724 ya2 +伣俔 2721 xian4 +伤傷 2822 shang1 640 +伥倀 2223 chang1 +伦倫 2821 lun2 1167 +伧傖 2821 cang1cheng2 +伨 2722 xun4 +伩 2024 xin4 +伪偽 2422 wei3 1678 +伫佇 2321 zhu4 stand 3559 +伬 2628 chi3 +伭 2023 xuan2 +伮 2724 nu2 +伯 2620 bo2bai3 uncle 854 +估 2426 gu1gu3gu4 1628 +伱 2829 ni3 +伲 2721 ni3ni4 +伳 2421 xie4 +伴 2925 ban4pan4 1157 +伵 2620 xu4 +伶 2823 ling2 2830 +伷 2526 zhou4 +伸 2520 shen1 971 +伹 2721 qu1 +伺 2722 si4ci4 2336 +伻 2124 beng1 +似 2820 si4shi4 390 +伽 2620 qie2jia1 3470 +伾 2121 pi1 +伿 2628 yi4 +佀 2727 si4shi4 +佁 2326 ai3yi3chi4si4 +佂 2121 zheng1 +佃 2620 dian4tian2 +佄 2427 han2 +佅 2529 mai4 +但 2621 dan4 127 +佇伫 2322 zhu4 +佈 2422 bu4 +佉 2423 qu1 +佊 2424 bi3 +佋 2726 shao4 +佌 2121 ci3 +位 2021 wei4 142 +低 2224 di1 low 450 +住 2021 zhu4 279 +佐 2421 zuo3 2244 +佑 2426 you4 2370 +佒 2528 yang1 +体體 2523 ti3 body 177 +佔 2126 zhan4 +何 2122 he2he4 171 +佖 2329 bi4 +佗 2321 tuo2 +佘 8090 she2 +余余 8090 yu2 534 +佚 2528 yi4 +佛 2522 fo2fu2 889 +作 2821 zuo4 do 50 +佝 2722 kou4gou1 +佞 2124 ning4 +佟 2723 tong2 3144 +你 2729 ni3 you 182 +佡 2827 xuan1 +佢 2121 qu2 +佣傭 2722 yong4yong1 2720 +佤 2121 wa3 +佥僉 8010 qian1 +佦 2126 shi2 +佧 2123 ka3 +佨 2721 bao1 +佩 2721 pei4 1308 +佪 2620 hui2huai2 +佫 2726 he4 +佬 2421 lao3 3664 +佭 2725 xiang2 +佮 2826 ge2 +佯 2825 yang2 3589 +佰 2126 bai3bo2 hundred +佱 8010 fa3 +佲 2726 ming2 +佳 2421 jia1 excellent 1064 +佴 2124 er4nai4mi3 +併并 2824 bing4 +佶 2426 ji2 +佷 2723 hen3 +佸 2226 huo2 +佹 2721 gui3 +佺 2821 quan2 +佻 2221 tiao1 +佼 2024 jiao3jiao1 3635 +佽 7728 ci4 +佾 2822 yi4 +使 2520 shi3 cause make 130 +侀 2220 xing2 +侁 2421 shen1 +侂 2021 tuo1 +侃 2621 kan3 2943 +侄 2121 zhi2 2477 +侅 2028 gai1 +來来 4090 lai2 +侇 2528 yi2 +侈 2722 chi3 3242 +侉 2422 kua1kua3 +侊 2921 guang1 +例 2220 li4 877 +侌 8073 yin1 +侍 2424 shi4 1982 +侎 2929 mi3mei3 +侏 2529 zhu1 +侐 2721 xu4 +侑 2422 you4 +侒 2324 an1 +侓 2520 lu4 +侔 2325 mou2 +侕 2122 er2 +侖仑 8022 lun2 +侗 2722 dong4tong2tong3 +侘 2321 cha4 +侙 2324 chi4 +侚 2722 xun4 +供 2428 gong1gong4 767 +侜 2724 zhou1 +依 2023 yi1yi3 459 +侞 2620 ru3 +侟 2424 jian4 +侠俠 2428 xia2 2120 +価 2126 jia4 +侢 2124 zai4 +侣侶 2626 lv3 companion 2703 +侤 2422 ta1 +侥僥 2521 jiao3 3371 +侦偵 2128 zhen1 2257 +侧側 2220 ce4ze4 1215 +侨僑 2222 qiao2 2735 +侩儈 2823 kuai4 +侪儕 2022 chai2 +侫 2024 ning4 +侬儂 2423 nong2 3949 +侭 2521 jin3 +侮 2825 wu3 2664 +侯 2728 hou2hou4 1396 +侰 2726 jiong3 +侱 2621 cheng3 +侲 2123 zhen4 +侳 2821 zuo4cuo4 +侴 8012 chou3 +侵 2724 qin1 1453 +侶侣 2626 lv3 +侷 2722 ju2 +侸 2111 shu4 +侹 2224 ting3 +侺 2222 shen4 +侻 2821 tuo1 +侼 2424 bo2 +侽 2622 nan2 +侾 2424 hao1 +便 2124 bian4pian2 208 +俀 2224 tui3 +俁俣 2628 yu3 +係系 2229 xi4 +促 2628 cu4 1190 +俄 2325 e2 1544 +俅 2329 qiu2 +俆 2829 xu2shu1 +俇 2121 kuang3kuang1guang4 +俈 2426 ku4 +俉 2126 wu4 +俊 2324 jun4 1400 +俋 2621 yi4 +俌 2322 fu3 +俍 2323 lang2 +俎 8781 zu3 3906 +俏 2922 qiao4 2491 +俐 2220 li4 3270 +俑 2722 yong3 +俒 2321 hun4 +俓 2121 jing4 +俔伣 2621 xian4 +俕 2329 san4 +俖 2126 pai3 +俗 2826 su2 1281 +俘 2224 fu2 2717 +俙 2422 xi1 +俚 2621 li3 +俛 2721 fu3mian3 +俜 2522 ping1 +保 2629 bao3 269 +俞 8022 yu2shu4 2564 +俟 2328 si4qi2 3691 +俠侠 2428 xia2 +信 2026 xin4 letter 128 +俢 2722 xiu1 +俣俁 2628 yu3 +俤 2822 ti4 +俥伡 2520 che1 +俦儔 2524 chou2 +俧 2423 zhi4 +俨儼 2120 yan3 3283 +俩倆 2122 lia3liang3 1673 +俪儷 2122 li4 +俫倈 2529 lai2lai4 +俬 2223 si1 +俭儉 2821 jian3 2806 +修 2822 xiu1 577 +俯 2024 fu3 2255 +俰 2620 he4 +俱 2628 ju4 1457 +俲 2422 xiao4 +俳 2121 pai2 +俴 2325 jian4 +俵 2523 biao4 +俶 2724 chu4ti4 +俷 2721 fei4 +俸 2525 feng4 +俹 2121 ya4 +俺 2421 an3 2464 +俻 2726 bei4 +俼 2022 yu4 +俽 2728 xin1 +俾 2624 bi3 +俿 2121 jian4 +倀伥 2123 chang1 +倁 2620 chi2 +倂 2824 bing4 +倃 2326 jiu4 +倄 2422 yao2 +倅 2024 cui4 +倆俩 2122 lia3liang3 +倇 2321 wan3 +倈俫 2429 lai2lai4 +倉仓 8060 cang1 +倊 2823 zong4 +個个 2620 ge4ge3 +倌 2327 guan1 +倍 2026 bei4 double 1361 +倎 2528 tian1 +倏 2728 shu1 3026 +倐 2729 shu1 +們们 2722 men2 +倒 2220 dao3dao4 pour reverse 505 +倓 2928 tan2 +倔 2727 jue2jue4 3463 +倕 2221 chui2 +倖 2424 xing4 +倗 2722 peng2 +倘 2922 tang3chang2 2139 +候 2728 hou4 338 +倚 2422 yi3 2132 +倛 2428 qi1 +倜 2722 ti4 +倝 4840 gan4 +倞 2029 jing4liang4 +借 2426 jie4 borrow 907 +倠 2021 sui1 +倡 2626 chang4chang1 2502 +倢 1528 jie2 +倣 2824 fang3pang2 +値 2421 zhi2 +倥 2321 kong1kong3 +倦 2921 juan4 2277 +倧 1329 zong1 +倨 2726 ju4 +倩 2522 qian4qing4 2780 +倪 2721 ni2ni4 2541 +倫伦 2822 lun2 +倬 2124 zhuo1 +倭 2224 wei1wo1 +倮 2629 luo3 +倯 2823 song1 +倰 2424 leng4 +倱 2621 hun4 +倲㑈 2529 dong1 +倳 2520 zi4 +倴 2424 ben4 +倵 2324 wu3 +倶 2628 ju4ju1 +倷 2429 nai4 +倸 2229 cai3 +倹 2828 jian3 +债債 2528 zhai4 1801 +倻 2722 ye1 +值 2421 zhi2zhi4 615 +倽 2826 sha4 +倾傾 2128 qing1 1296 +倿 2024 ning4 +偀 2428 ying1 +偁 2224 cheng1 +偂 2822 jian1 +偃 2121 yan3 3858 +偄 2128 nuan4 +偅 2221 zhong4 +偆 2526 chun3 +假 2724 jia3jia4 false 563 +偈 2622 ji4jie2 +偉伟 2425 wei3 +偊 2222 yu3ju3 +偋 2724 bing3 +偌 2426 ruo4 3760 +偍 2628 ti2 +偎 2623 wei1 3450 +偏 2322 pian1 1007 +偐 2022 yan4 +偑㐽 2721 feng1 +偒 2622 tang3dang4 +偓 2721 wo4 +偔 2622 e4 +偕 2226 xie2jie1 3355 +偖 2426 che3 +偗 2926 sheng3 +偘 2626 kan3 +偙 2022 di4 +做 2824 zuo4 do make 188 +偛 2227 cha1 +停 2022 ting2 stop 635 +偝 2122 bei4 +偞 2429 ye4 +偟 2621 huang2 +偠 2124 yao3 +偡 2421 zhan4 +偢 2928 chou3 +偣 2026 yan1 +偤 2826 you3 +健 2524 jian4 1101 +偦 2722 xu1 +偧 2422 zha1 +偨 2229 ci1 +偩 2728 fu4 +偪 2126 bi1 +偫 2424 zhi4 +偬傯 2723 zong3 +偭 2126 mian3 +偮 2624 ji2 +偯 2023 yi3 +偰 2728 xie4 +偱 2226 xun2 +偲 2623 si1 +偳 2222 duan1 +側侧 2220 ce4ze4 +偵侦 2128 zhen1 +偶 2622 ou3 1481 +偷 2822 tou1 steal 1135 +偸 2823 tou1 +偹 2726 bei4 +偺 2826 za2zan2 +偻僂 2924 lv3lou2 +偼 2128 jie2 +偽伪 2422 wei3 +偾僨 2428 fen4 +偿償 2923 chang2 1760 +傀 2621 gui1kui3 +傁 2724 sou3 +傂 2121 zhi4 +傃 2529 su4 +傄 2426 xia1 +傅 2324 fu4 1477 +傆 2129 yuan4 +傇 2424 rong3 +傈 2129 li4 +傉 2124 ru4 +傊 2628 yun3 +傋 2524 gou4 +傌 2122 ma4 +傍 2022 bang4pang2 2504 +傎 2428 dian1 +傏 2326 tang2 +傐 2022 hao4 +傑杰 2529 jie2 +傒 2228 xi1xi2xi4 +傓 2322 shan4 +傔 2823 qian4 +傕 2421 jue2 +傖伧 2826 cang1cheng2 +傗 2026 chu4 +傘伞 8040 san3 +備备 2422 bei4 +傚 2824 xiao4 +傛 2326 yong3rong2 +傜 2727 yao2 +傝 2622 tan4ta4 +傞 2821 suo1 +傟 2822 yang3 +傠 2420 fa1 +傡 2021 bing4 +傢 2323 jia1 furniture +傣 2529 dai3 +傤 2325 zai4 +傥儻 2921 tang3 +傦 2722 gu1 +傧儐 2328 bin4 +储儲 2426 chu3 1969 +傩儺 2021 nuo2 +傪 2322 can1 +傫 2629 lei3 +催 2221 cui1 1922 +傭佣 2022 yong1yong2 +傮 2426 zao1cao2 +傯偬 2723 zong3 +傰 2212 peng2 +傱 2828 song3 +傲 2824 ao4 1620 +傳传 2524 chuan2zhuan4 +傴伛 2121 yu3 +債债 2528 zhai4 +傶 2325 cou4 +傷伤 2822 shang1 +傸 2428 qiang3 +傹 2021 jing4jiang1 +傺 2229 chi4 +傻 2624 sha3 1932 +傼 2428 han4 +傽 2024 zhang1 +傾倾 2128 qing1 +傿 2122 yan4 +僀 2422 di4 +僁 2223 xi1 +僂偻 2524 lv3lou2 +僃 2422 bei4 +僄 2129 piao4 +僅仅 2421 jin3jin4 +僆 2523 lian2lian3lian4 +僇 2722 lu4 +僈 2624 man4 +僉佥 8088 qian1 +僊仙 2121 xian1 +僋 2828 tan4 +僌 2824 ying2 +働 2422 dong4 +僎 2728 zhuan4 +像 2723 xiang4 284 +僐 2826 shan4 +僑侨 2222 qiao2 +僒 2326 jiong3 +僓 2528 tui3tui2 +僔 2824 zun3 +僕仆 2228 pu2 +僖 2426 xi1 +僗 2922 lao2 +僘 2824 chang3 +僙 2428 guang1 +僚 2429 liao2 2990 +僛 2728 qi1 +僜 2221 deng4 +僝 2724 chan2 +僞伪 2222 wei3wei4 +僟 2225 ji1 +僠 2226 fan1 +僡 2523 hui4 +僢 2225 chuan3 +僣 2526 jian4 +僤 2625 dan4 +僥侥 2421 jiao3 +僦 2321 jiu4 +僧 2826 seng1 2174 +僨偾 2428 fen4 +僩 2722 xian4 +僪 2722 jue2 +僫 2123 e4 +僬 2023 jiao1jiao4 +僭 2526 jian4 +僮 2021 tong2zhuang4 +僯 2925 lin3 +僰 4480 bo2 +僱 2321 gu4 +僲 2125 xian1 +僳 2129 su4 +僴 2722 xian4 +僵 2121 jiang1 2251 +僶 2721 min3 +僷 2429 ye4 +僸 2429 jin4 +價价 2128 jia4 +僺 2629 qiao4 +僻 2024 pi4 2548 +僼 2521 feng1 +僽 2923 zhou4 +僾 2224 ai4 +僿 2321 sai4 +儀仪 2825 yi2 +儁 2022 jun4 +儂侬 2523 nong2 +儃 2021 chan2tan3 +億亿 2023 yi4 +儅 2926 dang1dang4 +儆 2824 jing3 +儇 2623 xuan1 +儈侩 2826 kuai4 +儉俭 2828 jian3 +儊 2428 chu4 +儋 2726 dan1 +儌 2824 jiao3yao2 +儍 2224 sha3 +儎 2325 zai4 +儏 2729 can4 +儐傧 2328 bin4bin1 +儑 2623 an4e4 +儒 2122 ru2 2114 +儓 2421 tai2 +儔俦 2424 chou2 +儕侪 2022 chai2 +儖 2821 lan2 +儗 2728 ni3 +儘尽 2521 jin3 +儙 2523 qian4 +儚 2522 meng2 +儛 2125 wu3 +儜 2322 ning2 +儝 2929 qiong2 +儞 2122 ni3 +償偿 2928 chang2 +儠 2221 lie4 +儡 2626 lei3 +儢 2123 lv3 +儣 2028 kuang4 +儤 2609 bao4 +儥 2428 du2 +儦 2023 biao1 +儧 2528 zan3 +儨 2228 zhi2 +儩 2622 si4 +優优 2124 you1 +儫 2023 hao2 +儬 2721 chen4 +儭 2621 chen4 +儮 2121 li4 +儯 2922 teng2 +儰 2022 wei3 +儱 2121 long3 +儲储 2426 chu3 +儳 2721 chan4 +儴 2023 rang2 +儵 2723 shu1 +儶 2222 hui4 +儷俪 2121 li4 +儸㑩 2621 luo2 +儹 2428 zan3 +儺傩 2021 nuo2 +儻傥 2923 tang3 +儼俨 2624 yan3 +儽 2629 lei3 +儾 2523 nang4 +儿兒 2201 er2 u son 273 +兀 1021 wu4 2931 +允 2321 yun3 1324 +兂 5021 zan1 +元 1021 yuan2 319 +兄 6021 xiong1 933 +充 0021 chong1 665 +兆 3211 zhao4 million 1895 +兇 2221 xiong1 +先 2421 xian1 first 141 +光 9021 guang1 light 201 +兊 8012 dui4 +克剋 4021 ke4 510 +兌兑 8021 dui4 +免 2741 mian3 729 +兎 2051 tu4 +兏 7221 chang2 +児 2621 er2 +兑兌 8021 dui4rui4yue4 2684 +兒儿 7721 er2er5 +兓 1141 xin1 +兔 2741 tu4 2432 +兕 7721 si4 +兖兗 0021 yan3 +兗兖 0021 yan3 +兘 1821 shi3 +兙 4421 ke2 +党黨 9021 dang3 830 +兛 4221 qian1 +兜 7721 dou1 2590 +兝 4821 fen1 +兞 4221 mao2 +兟 2421 shen1 +兠 1221 dou1 +兡 4121 baike2 +兢 4421 jing1 2723 +兣 4121 li3ke4 +兤 9021 huang2 +入 8000 ru4 u 150 +兦 2871 wang2 +內内 4022 nei4na4 +全 8010 quan2 96 +兩两 1022 liang3 +兪 8023 yu2shu4 +八 8000 ba1 u eight 376 +公 8073 gong1 104 +六 0080 liu4lu4 six 448 +兮 8002 xi1 2377 +兯 8022 han1 +兰蘭 8010 lan2 641 +共 4480 gong4gong1 461 +兲 1080 tian1 +关關 8080 guan1 close shut 129 +兴興 9080 xing1xing4 380 +兵 7280 bing1 587 +其 4480 qi2ji1 74 +具 7780 ju4 466 +典 5580 dian3 1147 +兹茲 8073 zi1 2162 +兺 8061 bun1 +养養 8022 yang3 704 +兼 8023 jian1 1405 +兽獸 8060 shou4 beast 1987 +兾 8080 ji4 +兿 8073 yi4 +冀 1280 ji4 2701 +冁囅 8753 chan3 +冂 7722 jiong1 u +冃 7722 mao4 +冄 7755 ran3 +内內 4022 nei4 151 +円 7722 yuan2 +冇 4022 mao3 +冈岡 7722 gang1 2368 +冉 5055 ran3 2722 +冊册 7744 ce4 +冋 7722 jiong1 +册冊 7744 ce4 1576 +再 1044 zai4 147 +冎 7722 gua3 +冏 7722 jiong3 +冐 6022 mao4mo4 +冑 5022 zhou4 helmet +冒 6060 mao4mo4 1148 +冓 5555 gou4gou1 +冔 6064 xu3 +冕 6041 mian3 3167 +冖 3702 mi4 u +冗 3721 rong3 3067 +冘 4021 yin2you2 +写寫 3712 xie3 write 423 +冚 3777 kan3 +军軍 3750 jun1 army military 323 +农農 4073 nong2 agriculture 778 +冝 3710 yi2 +冞 3790 mi2 +冟 3771 shi4 +冠 3721 guan1guan4 1351 +冡 3723 meng2 +冢 3723 zhong3 3455 +冣 3744 ju4 +冤 3741 yuan1 1884 +冥 3780 ming2 2569 +冦 3721 kou4 +冧 3799 lin2 +冨 3760 fu4 +冩 3732 xie3 +冪幂 3722 mi4 +冫 3010 bing1 u +冬 2730 dong1 winter 1302 +冭 4030 tai2 +冮 3111 gang1 +冯馮 3712 feng2ping2 1663 +冰 3219 bing1 ice 1000 +冱 3111 hu4 +冲沖 3510 chong1 621 +决決 3518 jue2 303 +冴 3114 hu4 +况況 3611 kuang4 470 +冶 3316 ye3 2446 +冷 3812 leng3 cold 592 +冸 3915 pan4 +冹 3314 fu2 +冺 3714 min3 +冻凍 3419 dong4 2073 +冼 3411 xian3 +冽 3210 lie4 3764 +冾 3816 xia2 +冿 3510 jian1 +净凈 3715 jing4 1244 +凁 3519 shu4 +凂 3711 mei3 +凃 3819 tu2 +凄 3514 qi1 2279 +凅 3610 gu4he2 +准準 3011 zhun3 accurate standard 379 +凇 3813 song1 +凈净 3215 jing4 +凉涼 3019 liang2liang4 cool cold 1465 +凊 3512 qing4 +凋 3712 diao1 3327 +凌 3414 ling2 1404 +凍冻 3519 dong4 +凎 3811 gan4 +减減 3315 jian3 minus 1171 +凐 3111 yin1 +凑湊 3518 cou4 1910 +凒 3211 yi2 +凓 3119 li4 +凔 3816 cang1 +凕 3718 ming3 +凖 3040 zhun3 +凗 3211 cui2 +凘 3212 si1 +凙 3614 duo2 +凚 3419 jin4 +凛凜 3019 lin3 2579 +凜凛 3019 lin3 +凝 3718 ning2 1243 +凞 3733 xi1 +凟 3418 du2 +几幾 7721 ji3 u 158 +凡 7721 fan2 892 +凢 2721 fan2 +凣 2721 fan2 +凤鳳 7721 feng4 phoenix 1273 +凥 7721 ju1 +処 2740 chu3chu4ju4 +凧 7721 zheng1 +凨 7721 feng1 +凩 7721 mu4 +凪 7721 zhi3 +凫鳧 2721 fu2 +凬 7721 feng1 +凭憑 2221 ping2 1229 +凮 7721 feng1 +凯凱 2771 kai3 1753 +凰 7721 huang2 2828 +凱凯 2711 kai3 +凲 7721 gan1 +凳 1221 deng4 2716 +凴 3121 ping2 +凵 2277 qu1 u +凶 2277 xiong1 fierce 1559 +凷 2277 kuai4 +凸 7777 tu1 convex 2774 +凹 7777 ao1wa1 hollow 2822 +出 2277 chu1 out 18 +击擊 5077 ji1 stroke 658 +凼 2277 dang4 +函 1077 han2 2012 +凾 1777 han2 +凿鑿 3277 zao2 2992 +刀 1722 dao1 u knife 934 +刁 1712 diao1 2827 +刂 2200 dao1 +刃 1732 ren4 blade 2408 +刄 1744 ren4 +刅 1733 chuang1 +分 8022 fen1fen4 minute 67 +切 4772 qie1qie4 cut 358 +刈 4200 yi4 +刉 8270 ji1 +刊 1240 kan1 1603 +刋 2240 qian4kan1 +刌 4230 cun3 +刍芻 2717 chu2 +刎 2220 wen3 +刏 8200 ji1 +刐 7240 dan3 +刑 1240 xing2 1334 +划劃 5200 hua2hua4 804 +刓 1220 wan2 +刔 5280 jue2 +刕 1722 li2 +刖 7220 yue4 +列 1220 lie4 column 671 +刘劉 0240 liu2 753 +则則 7280 ze2 255 +刚剛 7220 gang1 478 +创創 8270 chuang4chuang1 939 +刜 5200 fu2 +初 3722 chu1 511 +刞 7210 qu4 +刟 1260 ju1 +删刪 7240 shan1 2617 +刡 7270 min3 +刢 8230 ling2 +刣 2260 zhong1 +判 9250 pan4 983 +別别 6220 bie2 +刦 4270 jie2 +刧 4772 jie2 +刨 2270 bao4pao2 3786 +利 2290 li4 219 +刪删 7240 shan1 +别別 6240 bie2bie4 other 157 +刬剗 5200 chan3 +刭剄 1210 jing3 +刮颳 2260 gua1 2326 +刯 1210 gen1 +到 1210 dao4 to 17 +刱 5703 chuang4 +刲 4210 kui1 +刳 4220 ku1 +刴 1290 duo4 +刵 1240 er4 +制 2220 zhi4 manufacture 274 +刷 7220 shua1shua4 1756 +券 9022 quan4 2290 +刹剎 4290 cha4sha1 2155 +刺 5290 ci4qi4 sting thorn 1080 +刻 0280 ke4 454 +刼 4772 jie2 +刽劊 8270 gui4 +刾 5280 ci4qi4 +刿劌 2220 gui4 +剀剴 2270 kai3 +剁 7290 duo4 +剂劑 0220 ji4 dose 2424 +剃 8220 ti4 shave 3610 +剄刭 1210 jing3 +剅 1210 lou2 +剆 3270 gen1 +則则 6280 ze2 +剈 6220 yuan1 +剉 8210 cuo4 +削 9220 xue1xiao1 1994 +剋克 4221 ke4 +剌 5290 la4la2 3847 +前 8022 qian2 before 58 +剎刹 4290 cha4sha1 +剏 8745 chuang4chuang1 +剐剮 6220 gua3 +剑劍 8210 jian4 sword 1062 +剒 4260 cuo4 +剓 2722 li2 +剔 6220 ti1 2736 +剕 1210 fei4 +剖 0260 pou1 2471 +剗刬 5250 chan3 +剘 4280 qi2 +剙 8743 chuang4 +剚 5200 zi4 +剛刚 7220 gang1 +剜 3220 wan1 +剝剥 2210 bo1bao1 +剞 4260 ji1 +剟 7240 duo1 +剠 0290 qing2lue4 +剡 9280 yan3shan4 +剢 1220 zhuo2 +剣 8250 jian4 +剤 0220 ji4 +剥剝 2210 bo1bao1pu1 strip 2086 +剦 4270 yan1 +剧劇 7220 ju4 1051 +剨 5260 huo4 +剩 2290 sheng4 1363 +剪 8022 jian3 1765 +剫 0220 duo2 +剬 2220 duan1tuan2zhi4 +剭 7220 wu1 +剮剐 7220 gua3 +副 1260 fu4 vice 701 +剰 2290 sheng4 +剱 8752 jian4 +割 3260 ge1 cut 1517 +剳 4260 zha1 +剴剀 2210 kai3 +創创 8260 chuang4chuang1 +剶 2220 juan1 +剷 0220 chan3 +剸 5230 tuan2zhuan1 +剹 1220 lu4 +剺 5822 li2 +剻 2220 fou2 +剼 2220 shan1 +剽 1290 piao1 +剾 7270 kou1 +剿 2290 jiao3chao1 3378 +劀 1220 gua1 +劁 2230 qiao1 +劂 7220 jue2 +劃划 5210 hua4hua2 +劄 8862 zha2da2 +劅 6210 zhuo4 +劆 0220 lian2 +劇剧 2220 ju4 +劈 7022 pi1pi3 2400 +劉刘 7210 liu2 +劊刽 8260 gui4 +劋 6290 jiao3 +劌刿 1220 gui4 +劍剑 8280 jian4 +劎 8782 jian4 +劏㓥 9260 tang1 +劐 4240 huo1 +劑剂 0220 ji4 +劒 8782 jian4 +劓 2220 yi4 +劔 8785 jian4 +劕 7280 zhi4 +劖 2220 chan2 +劗 2280 cuan2jian3 +劘 0220 mo2 +劙 2210 li2 +劚㔉 7220 zhu2 +力 4002 li4 u 133 +劜 4201 ya4 +劝勸 7442 quan4 1432 +办辦 4033 ban4 326 +功 1412 gong1 power 353 +加 4600 jia1 add plus 186 +务務 2742 wu4 422 +劢勱 1422 mai4 +劣 9042 lie4 1871 +劤 7420 jin4 +劥 0422 keng1 +劦 4742 xie2 +劧 2752 zhi3 +动動 1472 dong4 77 +助 7412 zhu4 624 +努 4742 nu3 1270 +劫 4772 jie2 1718 +劬 2462 qu2 +劭 1462 shao4 +劮 2482 yi4 +劯 1462 zhu3 +劰 2462 miao3 +励勵 7422 li4 1816 +劲勁 1412 jing4jin4 1205 +劳勞 4442 lao2 857 +労 9042 lao2 +劵 9042 juan4quan4 +劶 7422 kou3 +劷 8452 yang2 +劸 4412 wa1 +効 0442 xiao4 +劺 2452 mou2 +劻 7472 kuang1 +劼 4462 jie2 +劽 1242 lie4 +劾 0482 he2 +势勢 5542 shi4 tendency 458 +勀 4422 ke4 +勁劲 1412 jin4jing4 +勂 2462 hao2 +勃 4442 bo2 1650 +勄 8472 min3 +勅 5492 chi4 +勆 3472 lang2 +勇 1742 yong3 982 +勈 1422 yong3 +勉 2421 mian3 1888 +勊 4421 ke4 +勋勛 6482 xun1 2476 +勌 9472 juan4 +勍 0492 qing2 +勎 4412 lu4 +勏 0462 pou3 +勐 1412 meng3 +勑 4492 chi4 +勒 4452 le4lei1 1250 +勓 2462 kai4 +勔 1462 mian3 +動动 2412 dong4 +勖 6462 xu4 +勗 6012 xu4 +勘 4472 kan1 2721 +務务 1822 wu4 +勚勩 4482 yi4 +勛勋 6482 xun1 +勜 8412 weng3 +勝胜 7922 sheng4 +勞劳 9942 lao2 +募 4442 mu4 3040 +勠 1422 lu4 +勡 1492 piao1 +勢势 4542 shi4 +勣 5482 ji1 +勤 4412 qin2 1431 +勥 1642 jiang4 +勦 2492 jiao3chao1 +勧 8422 quan4 +勨 2422 yang3 +勩勚 4482 yi4 +勪 1422 jue2 +勫 2462 fan2 +勬 9492 juan4 +勭 0412 tong2 +勮 2422 ju4 +勯 0412 dan1 +勰 4643 xie2 +勱劢 4422 mai4 +勲 2433 xun1 +勳 2432 xun1 +勴 2422 lv4 +勵励 7422 li4 +勶 2842 che4 +勷 0472 rang2xiang1 +勸劝 4422 quan4 +勹 2702 bao1 u +勺 2732 shao2 3259 +勻匀 2712 yun2 +勼 2742 jiu1 +勽 2782 bao4 +勾 2772 gou1 1677 +勿 2722 wu4 2125 +匀勻 2712 yun2 2585 +匁 2744 mangmi +匂 2772 xiong1 +匃 2772 gai4 +匄 2772 gai4 +包 2771 bao1 pack 378 +匆 2742 cong1 1461 +匇 2722 yi1 +匈 2772 xiong1 3095 +匉 2742 peng1 +匊 2792 ju2 +匋 2772 tao2 +匌 2762 ge2 +匍 2722 pu2 +匎 2772 an4 +匏 4721 pao2 +匐 2762 fu2 +匑 2722 gong1 +匒 2762 da2 +匓 2772 jiu4 +匔 2722 gong1 +匕 2271 bi3 u 3344 +化 2421 hua4 233 +北 1211 bei3 north 329 +匘 2276 nao3 +匙 6280 chi2shi5 2313 +匚 7171 fang1 u +匛 7171 jiu4 +匜 7171 yi2 +匝 7171 za1 3864 +匞 7171 jiang4 +匟 7171 kang4 +匠 7171 jiang4 2433 +匡 7171 kuang1 3012 +匢 7171 hu1 +匣 7171 xia2 2980 +匤 7171 qu1 +匥 7171 bian4 +匦匭 7171 gui3 +匧 7171 qie4 +匨 7171 zang1cang2 +匩 7171 kuang1 +匪 7171 fei3fei1 2412 +匫 7171 hu1 +匬 7171 tou2 +匭匦 7171 gui3 +匮匱 7171 gui4kui4 3792 +匯汇 7171 hui4 +匰 7171 dan1 +匱匮 7171 gui4kui4 +匲 7171 lian2 +匳 7171 lian2 +匴 7171 suan3 +匵 7171 du2 +匶 7171 jiu4 +匷 7171 qu2 +匸 7171 xi3 u +匹 7171 pi3 1421 +区區 7171 qu1 579 +医醫 7171 yi4yi1 643 +匼 7171 qia4an3ke1 +匽 7171 yan3 +匾 7171 bian3 3478 +匿 7171 ni4 2685 +區区 7171 qu1ou1 +十 4000 shi2 u ten 106 +卂 1741 xin4 +千 2040 qian1 thousand 430 +卄 4400 nian4 +卅 4400 sa4 +卆 4040 zu2 +升 2440 sheng1 913 +午 8040 wu3 994 +卉 4044 hui4 3231 +半 9050 ban4 half 332 +卋 4077 shi4 +卌 4400 xi4 +卍 1221 wan4 +华華 2440 hua2 309 +协協 4403 xie2 1120 +卐 2112 wan4 nazi 5000 +卑 2640 bei1 2160 +卒 0040 zu2cu4 2409 +卓 2140 zhuo1 1751 +協协 4402 xie2 +单單 8050 dan1 339 +卖賣 4080 mai4 sell 796 +南 4022 nan2na1 south 311 +単 9050 dan1 +卙 4470 ji2 +博 4304 bo2 1050 +卛 2240 shuai4 +卜蔔 2300 bu3 u 1834 +卝 1122 guan4kuang4 +卞 0023 bian4 3578 +卟 6300 bu3 +占 2160 zhan4 887 +卡 2123 qia3ka3 1248 +卢盧 2120 lu2 1505 +卣 2160 you3 +卤滷 2160 lu3 3655 +卥 2160 xi1 +卦 4310 gua4 3059 +卧 7370 wo4 1821 +卨 2122 xie4 +卩 7722 jie2bu4 u +卪 7722 jie2 +卫衛 1710 wei4 787 +卬 2772 ang2yang3 +卭 1712 qiong2 +卮 7221 zhi1 +卯 7772 mao3 3570 +印 7772 yin4 672 +危 2721 wei1 976 +卲 1762 shao4 +即 7772 ji2 291 +却卻 4772 que4 288 +卵 7772 luan3 2879 +卶 2722 shi4 +卷 9071 juan4quan2 953 +卸 8712 xie4 discharge 2330 +卹 2712 xu4 +卺 1771 jin3 +卻却 8762 que4 +卼 1721 wu4 +卽 2772 ji2 +卾 6722 e4 +卿 7772 qing1 1672 +厀 4792 xi1 +厁 8422 san1 +厂廠 7120 chang3han4 u factory 1151 +厃 2720 zhan1 +厄 7121 e4 2623 +厅廳 7122 ting1 lobby 977 +历曆 7122 li4 598 +厇 7121 zhe2 +厈 7124 han3an4 +厉厲 7122 li4 1304 +厊 7124 ya3 +压壓 7121 ya1ya4 press 820 +厌厭 7128 yan4 1714 +厍厙 7125 she4 +厎 7124 zhi3 +厏 7121 zha3 +厐龎 7121 pang2 +厑 7121 aesi1 +厒 7127 he2 +厓 7121 ya2yai2 +厔 7121 zhi4 +厕厠 7122 ce4 2775 +厖 7121 mang2 +厗 7124 ti2 +厘釐 7121 li2 3045 +厙厍 7125 she4 +厚 7124 hou4 thick 1063 +厛 7112 ting1 +厜 7121 zui1 +厝 7126 cuo4 +厞 7121 fei4 +原 7129 yuan2 207 +厠厕 7122 ce4 +厡 7129 yuan2 +厢廂 7126 xiang1 2389 +厣厴 7125 yan3 +厤 7129 li4 +厥 7128 jue2 3249 +厦廈 7124 sha4xia4 2406 +厧 7128 dian1 +厨廚 7124 chu2 1986 +厩廄 7121 jiu4 +厪 7121 qin2jin3 +厫 7124 ao2 +厬 7126 gui3 +厭厌 7128 yan4 +厮廝 7122 si1 2706 +厯 7123 li4 +厰 7124 chang3 +厱 7128 lan2qian1 +厲厉 7122 li4 +厳 9024 yan2 +厴厣 7150 yan3 +厵 7129 yuan2 +厶 2073 si1mou3 u +厷 4073 gong1 +厸 2273 lin2mian3 +厹 4773 qiu2 +厺 4073 qu4 +去 4073 qu4 go 88 +厼 2390 keum +厽 2373 lei3 +厾 1771 du1 +县縣 7773 xian4 1071 +叀 5073 zhuan1hui4 +叁叄 2310 san1 three 3791 +参參 2320 can1san1shen1 557 +參参 2320 can1san1shen1 +叄叁 2310 can1san1shen1 +叅 2333 can1can4cen1 +叆 1274 ai4 +叇 1573 dai4 +又 7740 you4 u again 125 +叉 7740 cha1cha2cha3 fork 1889 +及 1724 ji2 210 +友 4040 you3 401 +双雙 7744 shuang1 pair 350 +反 7224 fan3 reverse 285 +収 2774 shou1 +叏 5040 guai4 +叐 2040 ba2 +发發 2340 fa1fa4 hair 38 +叒 7744 ruo4 +叓 5040 shi4li4 +叔 2794 shu1 uncle 1388 +叕 7744 zhuo2 +取 1714 qu3qu1 take 295 +受 2040 shou4 229 +变變 0040 bian4 225 +叙敘 8794 xu4 1819 +叚 7724 jia3 +叛 9254 pan4 2328 +叜 3040 sou3 +叝 4774 gao4 +叞 7724 wei4 +叟 7740 sou3 3636 +叠疊 7710 die2 1931 +叡 2764 rui4 +叢丛 3214 cong2 +口 6000 kou3 u mouth 139 +古 4060 gu3 524 +句 2762 ju4gou1 526 +另 6042 ling4 else 536 +叧 6022 gua3 +叨 6702 tao1dao1 2823 +叩 6702 kou4 2620 +只 6080 zhi3 103 +叫 6400 jiao4 call 368 +召 1760 zhao4shao4 1367 +叭 6800 ba1 2771 +叮 6102 ding1 sting 2470 +可 1062 ke3ke4 26 +台 2360 tai2 341 +叱 6401 chi4 2984 +史 5000 shi3 570 +右 4060 you4 right 653 +叴 4060 qiu2 +叵 7171 po3 +叶葉 6400 ye4 leaf 812 +号號 6002 hao4hao2 507 +司 1762 si1 346 +叹嘆 6704 tan4 1129 +叺 6800 chi3 +叻 6402 le4 +叼 6702 diao1 3922 +叽嘰 6701 ji1 3490 +叾 1760 hongkong +叿 6101 hong1 +吀 6204 mie1 +吁 6104 xu1yu4 2039 +吂 0060 mang2 +吃 6801 chi1 eat 457 +各 2760 ge4 239 +吅 6600 xuan1song4 +吆 6203 yao1 3315 +吇 6704 zi3 +合 8060 he2 179 +吉 4060 ji2 995 +吊 6022 diao4 hang 1867 +吋 6400 cun4 inch +同 7722 tong2 65 +名 2760 ming2 name 134 +后后 7226 hou4 late 49 +吏 5000 li4 2698 +吐 6401 tu3tu4 1371 +向 2722 xiang4 119 +吒咤 6201 zha4zha1 +吓嚇 6103 xia4he4 1506 +吔 6401 ye3 +吕呂 6060 lv3 1511 +吖 6802 a1 +吗嗎 6702 ma5 608 +吘 6804 ou3 +吙 6908 xue1 +吚 6700 yi1 +君 1760 jun1 860 +吜 6701 chou3 +吝 0060 lin4 3426 +吞 2060 tun1 1627 +吟 6802 yin2 1607 +吠 6308 fei4 3694 +吡 6201 bi3 +吢 3360 qin4 +吣唚 6300 qin4 +吤 6802 jie4 +吥 6109 bu4 +否 1060 fou3pi3 639 +吧 6701 ba1ba5 773 +吨噸 6501 dun1 ton 2744 +吩 6802 fen1 2598 +吪 6401 e2 +含 8060 han2 856 +听聽 6202 ting1 hear listen obey 316 +吭 6001 hang2keng1 3180 +吮 6301 shun3 3718 +启啓 3026 qi3 1170 +吰 6403 hong2 +吱 6404 zhi1zi1 3204 +吲 6200 shen3yin3 +吳吴 2680 wu2 +吴吳 6080 wu2 1024 +吵 6902 chao3 1964 +吶呐 6402 na4ne4 +吷 6508 xue4 +吸 6704 xi1 988 +吹 6708 chui1chui4 blow 1292 +吺 6704 dou1 +吻 6702 wen3 1864 +吼 6201 hou3 2325 +吽 6500 ou1hong1hou3ou2 +吾 1060 wu2 1612 +吿 2460 gao4 +呀 6104 ya1ya5 1254 +呁 6702 jun4 +呂吕 6060 lv3 +呃 6101 e4 3854 +呄 1760 ge2 +呅 6004 mei2 +呆 6090 dai1ai2 1355 +呇 1260 qi3 +呈 6010 cheng2 1687 +呉 2680 wu2 +告 2460 gao4 300 +呋 6508 fu1 +呌 6400 jiao4 +呍 6103 hong1 +呎 6708 chi3 foot feet +呏 6400 sheng1 +呐吶 6402 na4ne4 2674 +呑 2060 tun1 +呒嘸 6101 fu3 +呓囈 6401 yi4 +呔 6403 dai1 +呕嘔 6101 ou1ou3ou4 vomit 2872 +呖嚦 6102 li4 +呗唄 6708 bai4bei5 +员員 6080 yuan2 361 +呙咼 6022 kuai1guo1wai1 +呚 6804 qi4 +呛嗆 6801 qiang1qiang4 3510 +呜嗚 6702 wu1 2533 +呝 6301 e4 +呞 6702 shi1chi1 +呟 6003 quan3 +呠 6503 pen1 +呡 6704 wen3 +呢 6701 ni2ne5 437 +呣 6705 mou2 +呤 6803 ling2ling4ling3 +呥 6504 ran3ran2 +呦 6402 you1 +呧 6204 di3 +周 7722 zhou1 409 +呩 6109 shi4 +呪 6601 zhou4 +呫 6106 tie1che4 +呬 6600 xi4 +呭 6401 yi4 +呮 6608 qi4 +呯 6104 ping2 +呰 2260 zi3 +呱 6203 gu1gua1 3645 +呲 6201 zi1 +味 6509 wei4 779 +呴 6702 xu1hou3hou1 +呵 6102 he1 1699 +呶 6704 nao2 +呷 6605 xia1 +呸 6101 pei1 +呹 6508 yi4 +呺 6602 xiao1hao2 +呻 6500 shen1 2928 +呼 6204 hu1xu1 628 +命 8062 ming4 264 +呾 6601 da2 +呿 6403 qu1 +咀 6701 ju3zu3 3663 +咁 6407 xian2gan1 +咂 6101 za1 +咃 6401 tuo1 +咄 6207 duo1 3197 +咅 0060 pou4 +咆 6701 pao2 3674 +咇 6300 bi4 +咈 6502 fu2 +咉 6508 yang1 +咊 6209 he2huo4huo2he4 +咋 6801 zha4ze2 3329 +和 2690 he2he4huo2huo4 and 22 +咍 6306 hai1 +咎 2860 jiu4gao1 2981 +咏詠 6309 yong3 2627 +咐 6400 fu4 2220 +咑 6102 que4que1jue2 +咒 6621 zhou4 2581 +咓 6101 wa3 +咔 6103 ka3 +咕 6406 gu1 2639 +咖 6600 ka1ga1 2452 +咗 6401 zuo3 +咘 6402 bu4 +咙嚨 6301 long2 throat 3198 +咚 6703 dong1 3154 +咛嚀 6302 ning2 3925 +咜 6301 tuo1 +咝噝 6201 si1 +咞 6104 xian4xian2 +咟 6106 huo4 +咠 6040 qi4 +咡 6104 er4 +咢 6602 e4 +咣 6901 guang1 +咤吒 6301 zha4zha1 +咥 6101 xi1die2 +咦 6508 yi2 3482 +咧 6200 lie3lie5 2918 +咨 3760 zi1 2793 +咩 6805 mie1 +咪 6909 mi1 3536 +咫 7680 zhi3 3886 +咬 6004 yao3 bite 1570 +咭 6406 ji1 +咮 6509 zhou4 +咯 6706 ge1ka3lo5 3033 +咰 6702 shuai4 +咱 6600 zan2za2 1232 +咲 6808 xiao4 +咳 6008 ke2hai1 2278 +咴 6408 hui1 +咵 6402 kua1 +咶 6206 huai4shi4 +咷 6201 tao2 +咸鹹 5320 xian2 2405 +咹 6304 e4an4 +咺 6101 xuan3xuan1 +咻 6409 xiu1xu3 +咼呙 7722 wai1 +咽 6600 yan1yan4ye4 2134 +咾 6401 lao3 +咿 6700 yi1 +哀 0073 ai1 1615 +品 6066 pin3 444 +哂 6106 shen3 +哃 6702 tong2 +哄 6408 hong1hong3hong4 2219 +哅 6702 xiong1 +哆 6702 duo1chi3 3175 +哇 6401 wa1wa5 wow 2554 +哈 6806 ha1ha3ha4 771 +哉 4365 zai1 2285 +哊 6402 yu4 +哋 6401 di4dei1 +哌 6203 pai4 +响響 6702 xiang3 463 +哎 6404 ai1 2729 +哏 6703 hen3gen2 +哐 6101 kuang1 +哑啞 6101 ya3ya1e4 dumb 2067 +哒噠 6403 da1 +哓嘵 6501 xiao1 +哔嗶 6204 bi4 +哕噦 6202 yue3hui4 +哖 6805 nian2 +哗嘩 6404 hua1hua2 2484 +哘 6102 xing2 +哙噲 6803 kuai4 +哚 6709 duo3 +哛 6222 po1 +哜嚌 6002 ji4 +哝噥 6403 nong2 3808 +哞 6305 mou1 +哟喲 6702 yo5yo1 2425 +哠 6406 hao4 +員员 6080 yuan2yun4 +哢 6104 long4 +哣 6101 pou3 +哤 6301 mang2 +哥 1062 ge1 676 +哦 6305 e2o2o4 2136 +哧 6403 chi1 3690 +哨 6902 shao4 2395 +哩 6601 li1li5li3 2100 +哪 6702 na3nei3na5ne2 542 +哫 6608 zu2 +哬 6102 he2 +哭 6680 ku1 cry 1210 +哮 6404 xiao1 3336 +哯 6701 xian4 +哰 6305 lao2 +哱 6404 bo1 +哲 5260 zhe2 1930 +哳 6202 zha1 +哴 6303 liang4lang2 +哵 6200 ba1 +哶 6104 mie1 +哷 6204 le4 +哸 6204 sui1 +哹 6204 fou2 +哺 6302 bu3 3089 +哻 6604 han4 +哼 6002 heng1 2199 +哽 6104 geng3 3340 +哾 6801 shuo1 +哿 4662 ge3ke3 +唀 6202 you3 +唁 6006 yan4 3933 +唂 6806 gu3 +唃 6702 gu3 +唄呗 6608 bai4bei5 +唅 6806 han2han4 +唆 6304 suo1 3609 +唇 7160 chun2 lip 1717 +唈 6601 yi4 +唉 6308 ai1ai4 2501 +唊 6408 jia2qian3 +唋 6809 tu3 +唌 6204 xian2yan2dan4 +唍 6301 huan3 +唎 6200 li4 +唏 6402 xi1 +唐 0026 tang2 759 +唑 6801 zuo4 +唒 6106 qiu2 +唓 6500 che1 +唔 6106 wu2 3737 +唕 6704 zao4 +唖 6101 ya3 +唗 6408 dou1 +唘 1760 qi3 +唙 6908 di2 +唚吣 6704 qin4 +唛嘜 6504 ma4 +唜 5061 ma1 +唝嗊 6108 hong3gong4 +唞 6400 dou3 +唟 4061 keos +唠嘮 6402 lao2 3545 +唡啢 6102 liang3 +唢嗩 6908 suo3 +唣 6601 zao4 +唤喚 6708 huan4 1390 +唥 6803 leng2 +唦 6902 sha1 +唧 6702 ji1 3801 +唨 6701 zuo3zu3 +唩 6204 wo1 +唪 6505 feng3beng3 +唫 6801 yin2 +唬 6101 hu3 3049 +唭 6408 qi1 +售 2060 shou4 1768 +唯 6001 wei2wei3 1049 +唰 6200 shua1 +唱 6606 chang4 sing 1152 +唲 6701 er2 +唳 6308 li4 +唴 6801 qiang4 +唵 6401 an3 +唶 6406 jie4ji2ze4 +唷 6002 yo1 +唸 6803 nian4 +唹 6803 yu1yo1 +唺 6508 tian3 +唻 6409 lai3 +唼 6004 sha4za1qie4 +唽 6202 xi1 +唾 6201 tuo4 3200 +唿 6703 hu1 +啀 6101 ai2 +啁 6702 zhou1zhao1 +啂 6201 nou4 +啃 6102 ken3 3286 +啄 6103 zhuo2zhou4 peck 3342 +啅 6104 zhuo2 +商 0022 shang1 425 +啇 0022 di2 +啈 6404 heng4 +啉 6409 lan2lin2 +啊 6102 a5 978 +啋 6209 xiao1 +啌 6301 xiang1qiang1 +啍 6004 tun1 +啎 8146 wu3 +問问 7760 wen4 +啐 6004 cui4 +啑 6508 sha4die2 +啒 6707 hu1 +啓启 3860 qi3 +啔 3360 qi3 +啕 6702 tao2 +啖 6908 dan4 +啗 6707 dan4 +啘 6301 ye4wa1 +啙 2266 zi3 +啚 6060 bi3tu2 +啛 6564 cui4 +啜 6704 chuo4 3761 +啝 6600 he2 +啞哑 6101 ya3ya1e4 +啟启 3860 qi3 +啠 7260 zhe2 +啡 6101 fei1pei1 2458 +啢唡 6102 liang3 +啣 6702 xian2 +啤 6604 pi2 3014 +啥 6806 sha4 2613 +啦 6001 la5la1 1490 +啧嘖 6508 ze2 3273 +啨 6502 qing1 +啩 6300 gua4 +啪 6600 pa1 3265 +啫 6206 zhe3 +啬嗇 4060 se4 +啭囀 6503 zhuan4 +啮嚙 6107 nie4 +啯 6600 guo5 +啰 6002 luo1luo2luo5 +啱 6206 yan1 +啲 6702 di4 +啳 6902 quan2jue2 +啴嘽 6805 tan1chan3 +啵 6404 bo5 +啶 6308 ding4 +啷 6702 lang1lang2 +啸嘯 6502 xiao4 2344 +啹 6706 ju2 +啺 6602 tang2 +啻 0060 chi4 +啼 6002 ti2 2240 +啽 6804 an2 +啾 6908 jiu1 +啿 6401 dan4 +喀 6306 ka1ke4ke5 2876 +喁 6602 yong2yu2 +喂 6603 wei4 hello 2038 +喃 6402 nan2 2455 +善 8060 shan4 586 +喅 6601 yu4 +喆 4466 zhe2 +喇 6200 la3 2691 +喈 6206 jie1 +喉 6708 hou2 2286 +喊 6305 han3 cry 1358 +喋 6409 die2zha2 3917 +喌 6632 zhou1 +喍 6209 chai2 +喎㖞 6702 wai1 +喏 6406 re3nuo4 3919 +喐 6702 yu4 +喑 6006 yin1yin4 +喒 6806 zan2 +喓 6104 yao1 +喔 6701 o1wo1 3387 +喕 6106 mian3 +喖 6406 hu2 +喗 6705 yun3 +喘 6202 chuan3 1995 +喙 6703 hui4 +喚唤 6708 huan4 +喛 6204 huan4yuan2xuan3he2 +喜 4060 xi3 467 +喝 6602 he1he4 drink 989 +喞 6702 ji1 +喟 6602 kui4 +喠 6201 zhong3 +喡 6405 wei3 +喢 6207 sha4 +喣 6733 xu3 +喤 6601 huang2 +喥 6004 du4 +喦 6077 nie4 +喧 6301 xuan1xuan3 2378 +喨 6001 liang4 +喩 6802 yu4 +喪丧 4073 sang1sang4 +喫 6708 chi1ji1 eat +喬乔 2022 qiao2 +喭 6002 yan4 +單单 6650 dan1shan4chan2 +喯 6404 pen1 +喰 6803 can1 +喱 6101 li2 +喲哟 6702 yo5yo1 +喳 6401 zha1cha1 3554 +喴 6305 wei1 +喵 6406 miao1 +営 9060 ying2 +喷噴 6408 pen1pen4 1790 +喸 5361 phos +喹 6401 kui2 +喺 6209 xi4 +喻 6802 yu4yu2 2288 +喼 6703 jie2 +喽嘍 6904 lou5lou2 3194 +喾嚳 9060 ku4 +喿 6090 sao4 +嗀 4764 huo4 +嗁 6201 ti2 +嗂 6707 yao2 +嗃 6002 he4xiao1xiao4 +嗄 6104 a2sha4 +嗅 6608 xiu4 3051 +嗆呛 6806 qiang1qiang4 +嗇啬 4060 se4 +嗈 6201 yong1 +嗉 6509 su4 +嗊唝 6108 hong3gong4 +嗋 6402 xie2 +嗌 6801 yi4ai4 +嗍 6702 suo1 +嗎吗 6102 ma5ma2ma3 +嗏 6409 cha1 +嗐 6306 hai4 +嗑 6401 ke4he2 +嗒 6406 ta4 3823 +嗓 6709 sang3 2637 +嗔 6408 tian2chen1 3587 +嗕 6104 ru4 +嗖 6704 sou1 +嗗 6702 wa1 +嗘 6708 ji1 +嗙 6002 pang3 +嗚呜 6702 wu1 +嗛 6803 xian2qian4qie4 +嗜 6406 shi4 3193 +嗝 6102 ge2 +嗞 6803 zi1 +嗟 6801 jie1jue1 3799 +嗠 6706 luo4 +嗡 6802 weng1 3403 +嗢 6601 wa4 +嗣 6722 si4 3043 +嗤 6203 chi1 3294 +嗥 6604 hao2 +嗦 6409 suo1 3411 +嗧 4622 jia1lun2 +嗨 6805 hai1hai3 hi 3830 +嗩唢 6908 suo3 +嗪 6509 qin2 +嗫囁 6104 nie4 +嗬 6402 he1 +嗭 4061 zi +嗮 6106 sai4 +嗯 6603 ng 2953 +嗰 6600 ge4 +嗱 6805 na2 +嗲 6802 dia3 +嗳噯 6204 ai4ai3ai1 3954 +嗴 6801 qiang1 +嗵 6703 tong1 +嗶哔 6605 bi4 +嗷 6804 ao2 +嗸 5860 ao2 +嗹 6503 lian2 +嗺 6201 cui1 +嗻 6003 zhe1 +嗼 6408 mo4 +嗽 6708 sou4 3050 +嗾 6808 sou3 +嗿 6808 tan3 +嘀 6002 di2 3601 +嘁 6305 qi1 +嘂 6666 jiao4 +嘃 6002 chong1 +嘄 6702 jiao1 +嘅 6101 kai3 +嘆叹 6408 tan4 +嘇 6302 san1 +嘈 6506 cao2 3418 +嘉 4046 jia1 1575 +嘊 6201 ai2 +嘋 6804 xiao1 +嘌 6109 piao1piao4 +嘍喽 6504 lou5lou2 +嘎 6105 ga1ga3 2945 +嘏 4764 gu3jia3 +嘐 6702 xiao1jiao1 +嘑 6104 hu1hu4la4 +嘒 6507 hui4 +嘓啯 6600 guo1 +嘔呕 6101 ou3ou1ou4 +嘕 6102 xian1 +嘖啧 6508 ze2 +嘗尝 9060 chang2 +嘘噓 6101 xu1 hush 2925 +嘙 6404 po2 +嘚 6604 de2de1dai1 +嘛 6009 ma5 1835 +嘜唛 6402 ma4 +嘝 6400 hu2 +嘞 6402 lei5 +嘟 6702 du1 3112 +嘠 6105 ga1ga3 +嘡 6901 tang1 +嘢 6702 ye3 +嘣 6202 beng1 +嘤嚶 6704 ying1 +嘥 6108 sai1 +嘦 6040 jiao4 +嘧 6307 mi4 +嘨 6502 xiao4chi4 +嘩哗 6405 hua1hua2 +嘪 6608 mai3 +嘫 6303 ran2 +嘬 6604 zuo1chuai4 +嘭 6202 peng1 +嘮唠 6902 lao2 +嘯啸 6502 xiao4 +嘰叽 6205 ji1 +嘱囑 6702 zhu3 2222 +嘲 6702 chao2zhao1 2223 +嘳 6508 kui4 +嘴 6202 zui3 mouth 991 +嘵哓 6401 xiao1 +嘶 6202 si1xi1 2726 +嘷 6704 hao2 +嘸呒 6803 fu3 +嘹 6409 liao2liao4 +嘺 6202 qiao2 +嘻 6406 xi1 2333 +嘼 6660 xiu4 +嘽啴 6605 tan1chan3 +嘾 6104 tan2 +嘿 6603 hei1mo4 2276 +噀 6708 xun4 +噁 6103 e3wu4 +噂 6804 zun3 +噃 6206 fan1 +噄 6709 chi1 +噅 6202 hui1 +噆 6106 zan3 +噇 6001 chuang2 +噈 6301 cu4 +噉 6804 dan4 +噊 6702 yu4 +噋 6804 tun1kuo4 +噌 6806 cheng1ceng1 +噍 6003 jiao4jiao1 +噎 6401 ye1 3778 +噏 6802 xi1 +噐 6666 qi4 +噑 6604 hao2 +噒 6905 lian2 +噓嘘 6101 xu1 +噔 6201 deng1 +噕 2060 hui1 +噖 6102 yin2 +噗 6208 pu1 3770 +噘 6108 jue1 +噙 6802 qin2 +噚㖊 6704 xun2 +噛 6107 nie4 +噜嚕 6706 lu1 3439 +噝咝 6209 si1 +噞 6808 yan3 +噟 0026 ying4 +噠哒 6403 da1 +噡 6706 dan1zhan1 +噢 6708 o1yu3 3147 +噣 6602 zhou4zhuo2 +噤 6409 jin4 +噥哝 6503 nong2 +噦哕 6105 yue3hui4 +噧 6402 hui4 +器 6666 qi4 537 +噩 1010 e4 3522 +噪 6609 zao4 2422 +噫 6003 yi1 +噬 6801 shi4 3195 +噭 6804 jiao4 +噮 6603 yuan1 +噯嗳 6204 ai3ai4ai1 +噰 6001 yong1 +噱 6103 jue2xue2 +噲哙 6806 kuai4 +噳 6108 yu3 +噴喷 6408 pen1pen4 +噵 3860 dao4 +噶 6402 ge2ga2 +噷 6708 xin1hen1 +噸吨 6108 dun1 +噹当 6906 dang1 +噺 6202 xin1 +噻 6301 sai5 +噼 6004 pi1 +噽 4161 pi3 +噾 6306 yin1 +噿 6704 zui3 +嚀咛 6302 ning2 +嚁 6701 di2 +嚂 6801 lan4han3lan2 +嚃 6603 ta4 +嚄 6404 huo4huo1 +嚅 6102 ru2 +嚆 6402 hao1 +嚇吓 6403 xia4he4 +嚈 6108 ya4 +嚉 6400 duo1 +嚊 6602 xi4 +嚋 6404 zhou1chou2 +嚌哜 6002 ji4 +嚍 6501 jin4 +嚎 6003 hao2 3550 +嚏 6408 ti4 +嚐 6906 chang2 +嚑 6203 xun1 +嚒 6003 me1 +嚓 6309 ca1 3958 +嚔 6408 ti4 +嚕噜 6706 lu1 +嚖 6503 hui4 +嚗 6603 bo2 +嚘 6104 you1 +嚙啮 6107 nie4 +嚚 6666 yin2 +嚛 6209 hu4 +嚜 6601 mo4me5ma5 +嚝 6008 huang1 +嚞 4066 zhe2 +嚟 6709 li2 +嚠 6200 liu2liu1 +嚡 6401 xie2hai2 +嚢 5073 nang2 +嚣囂 6666 xiao1ao2 2858 +嚤 6005 mo2 +嚥 6403 yan4 +嚦呖 6101 li4 +嚧 6101 lu2 +嚨咙 6101 long2 +嚩 6304 fu2po2 +嚪 6702 dan4 +嚫 6601 chen4 +嚬 6108 pin2 +嚭 4166 pi3 +嚮 2722 xiang4 +嚯 6101 huo4 +嚰 6006 mo2 +嚱 6305 xi4 +嚲亸 0645 duo3 +嚳喾 7760 ku4 +嚴严 6624 yan2 +嚵 6701 chan2 +嚶嘤 6604 ying1 +嚷 6003 rang3rang1 2142 +嚸 6106 dian3 +嚹 6104 la1 +嚺 6603 ta4 +嚻 6666 xiao1 +嚼 6204 jiao2jue2jiao4 2824 +嚽 6708 chuo4 +嚾 6401 huan1 +嚿 6407 huo4 +囀啭 6504 zhuan4 +囁嗫 6104 nie4 +囂嚣 6666 xiao1 +囃 6001 ca4 +囄 6001 li2lei1 +囅冁 6753 chan3 +囆 6403 chai4 +囇 6101 li4 +囈呓 6403 yi4 +囉啰 6601 luo1lou2 +囊 5073 nang2 2145 +囋 6408 zan4 +囌 6409 su1 +囍 4466 xi3 +囎 6806 zeng4 +囏 4486 jian1 +囐 6308 za2zan2 +囑嘱 6702 zhu3 +囒 6402 lan2 +囓 6707 nie4 +囔 6003 nang1 +囕 6801 ramo +囖 6801 luo2 +囗 6000 wei2 u 3873 +囘 7722 hui2 +囙 6017 yin1 +囚 6080 qiu2 2651 +四 6021 si4 four 191 +囜 6073 nin2 +囝 6040 jian3nan1 +回 6060 hui2 back 144 +囟 2600 xin4 +因 6080 yin1 121 +囡 6040 nan1 +团團 6024 tuan2 lump 591 +団 6034 tuan2 +囤 6071 dun4tun2 +囥 6021 kang4 +囦 6090 yuan1 +囧 6022 jiong3 +囨 6090 pian1 +囩 6073 yun4 +囪囱 2600 cong1 +囫 6022 hu2 +囬 6022 hui2 +园園 6021 yuan2 782 +囮 6021 e2you2 +囯 6010 guo2 +困睏 6090 kun4 834 +囱囪 2600 cong1 chimney +囲 6055 wei2 +図 6040 tu2 +围圍 6052 wei2 649 +囵圇 6071 lun2 +囶 6010 guo2 +囷 6090 qun1 +囸 6010 ri4 +囹 6030 ling2 +固 6060 gu4 1006 +囻 6024 guo2 +囼 6060 tai1 +国國 6010 guo2 country state nation 95 +图圖 6030 tu2 460 +囿 6022 you4 +圀 6022 guo2 +圁 6060 yin2 +圂 6023 hun4 +圃 6022 pu3 3271 +圄 6060 yu3 +圅 1760 han2 +圆圓 6080 yuan2 circle round 1095 +圇囵 6022 lun2 +圈 6071 quan1juan4 1301 +圉 6040 yu3 +圊 6022 qing1 +國国 6015 guo2 +圌 6022 chuan2chui2 +圍围 6050 wei2 +圎 6080 yuan2 +圏 6071 quan1 +圐 6022 ku1 +圑 6034 fu4 +園园 6023 yuan2 +圓圆 6080 yuan2 +圔 6010 e4 +圕 6060 tuan1 +圖图 6060 tu2 +圗 6060 tu2 +團团 6034 tuan2 +圙 6060 lue4 +圚 6080 hui4 +圛 6040 yi4 +圜 6073 yuan2huan2 +圝 6099 luan2 +圞 6090 luan2 +土 4010 tu3 u 663 +圠 4211 ya4 +圡 4010 tu3 +圢 4112 ting1ting3 +圣聖 7710 sheng4ku1 holy sacred 903 +圤 4310 pu3pu2 +圥 4021 lu4 +圦 4810 kuai4 +圧 7121 ya1 +在 4021 zai4 at 6 +圩 4114 wei2yu2xu1 +圪 4811 ge1 +圫 4211 yu4ao4 +圬 4112 wu1 +圭 4010 gui1 3018 +圮 4711 pi3 +圯 4711 yi2 +地 4411 di4de5 23 +圱 2441 qian1 +圲 4214 qian1 +圳 4210 zhen4 3566 +圴 4712 zhuo2 +圵 4111 dang4 +圶 4010 qia4 +圷 4113 xia4 +圸 4217 shan1 +圹壙 4010 kuang4 +场場 4712 chang2chang3 224 +圻 4212 qi2yin2 +圼 6010 nie4 +圽 4712 mo4 +圾 4714 ji2ji1 2642 +圿 4812 jia2 +址 4111 zhi3 1938 +坁 4214 zhi3 +坂阪 4214 ban3 3938 +坃 4111 xun1xun4 +坄 4714 tou2 +坅 4812 qin3 +坆 4814 fen2 +均 4712 jun1yun4 1106 +坈 4711 keng1 +坉 4511 tun2 +坊 4012 fang1fang2 2289 +坋 4812 fen4 +坌 8010 ben4 +坍 4714 tan1 3806 +坎 4718 kan3 2499 +坏壞 4119 huai4pi1pei2 bad 832 +坐 8810 zuo4 sit 439 +坑 4011 keng1 pit 2366 +坒 2210 bi4 +坓 4410 xing2 +坔 1210 di4 +坕 7210 jing1 +坖 1010 ji4 +块塊 4518 kuai4 612 +坘 4111 di3 +坙 1010 jing1 +坚堅 2710 jian1 764 +坛壇 4113 tan2 1675 +坜壢 4112 li4 +坝壩 4718 ba4 2907 +坞塢 4712 wu4 3689 +坟墳 4014 fen2 tomb 2371 +坠墜 7810 zhui4 fall 2382 +坡 4414 po1 1525 +坢 4915 pan3pan4 +坣 9010 tang1 +坤 4510 kun1 2545 +坥 4711 qu1 +坦 4611 tan3 1434 +坧 4116 zhi1 +坨 4311 tuo2 +坩 4417 gan1 +坪 4114 ping2 2883 +坫 4116 dian4 +坬 4213 gua4 +坭 4711 ni2ni4 +坮 4316 tai2 +坯 4111 pi1 3793 +坰 4712 jiong1 +坱 4518 yang3 +坲 4512 fo2 +坳 4412 ao4ao1 +坴 4010 liu4 +坵 4211 qiu1 +坶 4715 mu4 +坷 4112 ke3ke1 3844 +坸 4712 gou4 +坹 4318 xue4 +坺 4314 ba2bo1 +坻 4214 chi2di3 +坼 4214 che4 +坽 4813 ling2 +坾 4312 zhu4 +坿 4410 fu4 +垀 4214 hu1 +垁 4818 zhi4 +垂 2010 chui2 1311 +垃 4011 la1la5 2755 +垄壟 4310 long3 3325 +垅壠 4311 long3 +垆壚 4110 lu2 +垇 4717 ao4ao1 +垈 2310 dai4 +垉 4711 pao2 +垊 4714 min2 +型 1210 xing2 1159 +垌 4712 dong4tong2 +垍 4610 ji4 +垎 4716 ke4 +垏 4510 lu4 +垐 3710 ci2 +垑 4712 chi3 +垒壘 2310 lei3 2589 +垓 4018 gai1 +垔 1010 yin1 +垕 7221 hou4 +垖 4717 dui1 +垗 4211 zhao4 +垘 4318 fu2 +垙 4911 guang1 +垚 4011 yao2 +垛 4719 duo3 3941 +垜 4719 duo3 +垝 4711 gui3 +垞 4311 cha2 +垟 4815 yang2 +垠 4713 yin2 +垡 2310 fa2 +垢 4216 gou4 3182 +垣 4111 yuan2 3467 +垤 4111 die2 +垥 4816 xie2 +垦墾 7710 ken3 3296 +垧 4712 jiong1shang3 +垨 4314 shou3 +垩堊 1010 e4 +垪 4814 bing4 +垫墊 5510 dian4 pad cushion mat 2436 +垬 4418 hong2 +垭埡 4111 wu4ya4 +垮 4412 kua3 3305 +垯 4413 da2 +垰 4113 ka3 +垱壋 4917 dang4 +垲塏 4211 kai3 +垳 4112 huang2 +垴堖 4017 nao3 +垵埯 4314 an3 +垶 4014 xing1 +垷 4711 xian4 +垸 4311 huan4 +垹 4712 bang1 +垺 4214 pei1fu2pou2 +垻 4718 ba4 +垼 2710 yi4 +垽 3210 yin4 +垾 4614 han4 +垿 4014 xu4 +埀 2010 chui2zhui4 +埁 4212 cen2 +埂 4114 geng3 +埃 4318 ai1 2004 +埄 4715 peng2 +埅 7010 fang2fang1di4 +埆 4712 que4 +埇 4712 yong3 +埈 4314 xun4 +埉 4418 jia2 +埊 2210 di4 +埋 4611 mai2man2 1521 +埌 4313 lang4 +埍 4612 xuan4 +城 4315 cheng2 city 337 +埏 4214 yan2shan1 +埐 4714 jin1 +埑 5210 zhe2 +埒 4214 lei4 +埓 4714 lie4 +埔 4312 pu3bu4 3705 +埕 4611 cheng2 +埖 4411 hua1 +埗 4112 bu4 +埘塒 4410 shi2 +埙塤 4618 xun1 +埚堝 4612 guo1 +埛 4712 jiong1 +埜 4410 ye3 +埝 4813 nian4 +埞 4318 di3 +域 4315 yu4 1350 +埠 4714 bu4 3306 +埡垭 4111 ya4 +埢 4911 juan3 +埣 4014 sui4 +埤 4614 pi2bei1bi4 +埥 4512 cheng1 +埦 4311 wan3 +埧 4718 ju4 +埨 4812 lun3lun4 +埩 4215 zheng1 +埪 4311 kong1 +埫 4912 chong3 +埬 4519 dong1 +埭 4519 dai4 +埮 4918 tan4 +埯垵 4411 an3 +埰采 4219 cai4 +埱 4714 shu2 +埲 4515 beng3bang4 +埳 4717 kan3 +埴 4411 zhi2 +埵 4211 duo3 +埶 4511 yi4shi4 +執执 4541 zhi2 +埸 4612 yi4 +培 4016 pei2 1385 +基 4410 ji1 652 +埻 4014 zhun3 +埼 4412 qi2 +埽 4712 sao4sao3 +埾 1710 ju4 +埿 3710 ni2 +堀 4717 ku1 +堁 4619 ke4 +堂 9010 tang2 hall 717 +堃 0010 kun1 +堄 4711 ni4 +堅坚 7710 jian1 +堆 4011 dui1 1298 +堇 4410 jin3 +堈 4712 gang1 +堉 4412 yu4 +堊垩 1010 e4 +堋 4712 peng2beng4 +堌 4610 gu4 +堍 4711 tu4 +堎 4414 leng4 +堏 4010 fang1 +堐 4111 ya2 +堑塹 4210 qian4 +堒 4611 kun1 +堓 4214 an4 +堔 4719 shen1 +堕墮 7410 duo4hui1 2784 +堖垴 4216 nao3 +堗 4318 tu1 +堘 4911 cheng2 +堙 4111 yin1 +堚 4715 hun2 +堛 4116 bi4 +堜 4519 lian4 +堝埚 4712 guo1 +堞 4419 die2 +堟 4713 zhuan4 +堠 4718 hou4 +堡 2610 bao3bu3pu4 1794 +堢 4619 bao3 +堣 4612 yu2 +堤 4618 di1ti2 2169 +堥 1810 mao2 +堦 4216 jie1 +堧 4118 ruan2 +堨 4612 e4ai4ye4 +堩 4111 geng4 +堪 4411 kan1 1630 +堫 4214 zong1 +堬 4812 yu2 +堭 4611 huang2 +堮 4612 e4 +堯尧 4021 yao2 +堰 4111 yan4 3923 +報报 4744 bao4 +堲 7710 ji2 +堳 4716 mei2 +場场 4612 chang2chang3 +堵 4416 du3 2141 +堶 4412 tuo2 +堷 4016 yin4pou3 +堸 4711 feng2 +堹 4211 zhong4 +堺 4612 jie4 +堻 3510 zhen1 +堼 4410 feng1 +堽 4611 gang1 +堾 4516 chuan3 +堿 4315 jian3 +塀 4714 ping2 +塁 6010 lei3 +塂 4411 xiang4jiang3 +塃 4411 huang1 +塄 4612 leng2 +塅 4714 duan4 +塆 4012 wan1 +塇 4311 xuan1 +塈 7110 ji4xi4 +塉 4412 ji2 +塊块 4611 kuai4 +塋茔 9910 ying2 +塌 4612 ta1 2379 +塍 7921 cheng2 +塎 4316 yong3 +塏垲 4211 kai3 +塐 4519 su4 +塑 8710 su4 2152 +塒埘 4414 shi2 +塓 4718 mi4 +塔 4416 ta3 tower 1317 +塕 4812 weng3 +塖 4219 cheng2 +塗涂 3810 tu2 +塘 4016 tang2 2456 +塙 4012 que4 +塚 4713 zhong3 +塛 4119 li4 +塜 4713 peng2 +塝 4012 bang4 +塞 3010 sai1se4sai4 1061 +塟 4410 zang4 +塠 4713 dui1 +塡 4218 tian2 +塢坞 4712 wu4 +塣 3610 cheng3 +塤埙 4618 xun1 +塥 4112 ge2 +塦 7510 zhen4 +塧 4811 ai4 +塨 4413 gong1 +塩 4811 yan2 +塪 4217 kan3xian4 +填 4418 tian2zhen4 1878 +塬 4119 yuan2 +塭 4611 wen1 +塮 4410 xie4 +塯 4716 liu4 +塰 3810 hai3 +塱 3710 lang3 +塲 4812 chang2chang3 +塳 4713 peng2 +塴 4212 beng4 +塵尘 0021 chen2 +塶 4011 cu4 +塷 4116 lu3 +塸 4111 ou3ou1 +塹堑 5210 qian4 +塺 0021 mei2mo4 +塻 4418 mo4 +塼 4514 zhuan1 +塽 4418 shuang3 +塾 0510 shu2 +塿 4514 lou3 +墀 4715 chi2 +墁 4614 man4 +墂 4119 biao1 +境 4011 jing4 623 +墄 4315 qi1 +墅 6710 shu4 3032 +墆 4412 di4die2 +墇 4014 zhang1 +墈 4412 kan4 +墉 4012 yong1yong2 +墊垫 4510 dian4 +墋 4312 chen3 +墌 4313 zhi1 +墍 2110 xi4ji4 +墎 4712 guo1guo4 +墏 2710 qiang3 +墐 4411 jin4 +墑 4012 di1 +墒 4012 shang1 +墓 4410 mu4 tomb 1915 +墔 4211 cui1 +墕 4112 yan4 +墖 4816 ta3 +増 4816 zeng1 +墘 4811 qi2 +墙墻 4416 qiang2 wall 1025 +墚 4319 liang2 +墛 4410 wei4 +墜坠 7810 zhui4 +墝 4411 qiao1 +增 4816 zeng1 851 +墟 4111 xu1 3383 +墠 4615 shan4 +墡 4816 shan4 +墢 4214 ba2fei4bo1 +墣 4218 pu1pu2 +墤 4518 kuai4tui2 +墥 4011 dong3 +墦 4216 fan2 +墧 4212 que4qiao2 +墨 6010 mo4 1480 +墩 4814 dun1 3431 +墪 0810 dun1 +墫 4814 zun1cun2 +墬 7710 di4de5 +墭 4311 sheng4 +墮堕 7410 duo4hui1 +墯 9410 duo4hui1 +墰 4114 tan2 +墱 4711 deng4 +墲 4813 wu3 +墳坟 4418 fen2 +墴 4418 huang2 +墵 4113 tan2 +墶 4413 da1da5 +墷 4415 ye4 +墸 4416 zhu4 +墹 4712 jian4 +墺 4718 ao4yu4 +墻墙 4416 qiang2 +墼 5710 ji1 +墽 4814 qiao1 +墾垦 2710 ken3 +墿 4614 yi4 +壀 4014 pi2 +壁 7010 bi4 1262 +壂 7710 dian4 +壃 4111 jiang1 +壄 4410 ye3 +壅 0010 yong1yong3 +壆 7710 bo2 +壇坛 4011 tan2 +壈 4019 lan3 +壉 4113 ju4 +壊 4413 huai4 +壋垱 4916 dang4 +壌 4013 rang3 +壍 3210 qian4 +壎 4213 xun1xuan1 +壏 4811 lan4han3 +壐 1010 xi3 +壑 2710 he4huo4 3402 +壒 4411 ai4 +壓压 7121 ya1ya4 +壔 4414 dao3 +壕 4013 hao2 +壖 4112 ruan2 +壗 4511 jin4 +壘垒 6010 lei3 +壙圹 4018 kuang4 +壚垆 4111 lu2 +壛 4712 yan2 +壜 4613 tan2 +壝 4513 wei2wei3 +壞坏 4013 huai4 +壟垄 0110 long3 +壠垅 4111 long3 +壡 2761 rui4 +壢坜 4111 li4 +壣 4217 lin2 +壤 4013 rang3 2761 +壥 4111 chan2 +壦 4411 xun1xun4 +壧 4614 yan2 +壨 6610 lei2 +壩坝 4112 ba4 +壪 4212 wan1 +士 4010 shi4 u 324 +壬 2010 ren2 +壭 4022 san +壮壯 3411 zhuang4 1255 +壯壮 2421 zhuang4 +声聲 4027 sheng1 175 +壱 4071 yi1 +売 4021 mai4 +壳殻 4021 ke2qiao4 shell 2298 +壴 4010 zhu3 +壵 4011 zhuang4 +壶壺 4010 hu2 jar 2310 +壷 4010 hu2 +壸壼 4010 kun3 +壹 4010 yi1yi4 one +壺壶 4010 hu2 +壻 4712 xu4 +壼壸 4010 kun3 +壽寿 4064 shou4 +壾 4111 mang3 +壿 4814 zun1cun1zun3 +夀 5064 shou4 +夁 4060 yi1 +夂 2740 zhi3 u +夃 1722 gu1 +处處 2340 chu4chu3 136 +夅 2750 jiang4 +夆 2750 feng2pang2 +备備 2760 bei4 392 +夈 2790 zhai1 +変 0040 bian4 +夊 2740 sui1 u +夋 2340 qun1 +夌 4040 ling2 +复復 8040 fu4 357 +夎 8840 zuo4 +夏 1040 xia4 summer 921 +夐 2740 xiong4 +夑 9940 xie4 +夒 1040 nao2 +夓 7740 xia4 +夔 4440 kui2 +夕 2720 xi1xi4 u eve 1711 +外 2320 wai4 109 +夗 2721 yuan4wan3 +夘 2722 mao3 +夙 7721 su4 3624 +多 2720 duo1 37 +夛 1720 duo1 +夜 0024 ye4 602 +夝 2521 qing2 +夞 2361 oes +够夠 2722 gou4 565 +夠够 2722 gou4 +夡 2426 qi4 +夢梦 4420 meng4 +夣 0020 meng4 +夤 2780 yin2 +夥 6792 huo3 +夦 4772 chen3 +大 4080 da4 u big 13 +夨 2080 ce4 +天 1080 tian1 sky 86 +太 4003 tai4 too 237 +夫 5080 fu1 333 +夬 5080 guai4 +夭 2080 yao1 2705 +央 5080 yang1 1183 +夯 4042 hang1ben4 +夰 4022 gao3 +失 2580 shi1 345 +夲 4040 ben3tao1 +夳 4010 tai4 +头頭 3480 tou2 head 143 +夵 4090 yan3 +夶 4488 bi3 +夷 5080 yi2 2210 +夸誇 4002 kua1 2023 +夹夾 5080 jia2 1548 +夺奪 4034 duo2 rob snatch 1208 +夻 4060 hua4 +夼 4022 kuang3 +夽 4073 yun4 +夾夹 4080 jia1jia2 +夿 4071 pa1ba1 +奀 1080 en1mang2 +奁奩 4071 lian2 +奂奐 2780 huan4 +奃 4074 di4di1 +奄 4071 yan3yan1 3233 +奅 4072 pao4 +奆 4071 quan3 +奇 4062 qi2ji1 513 +奈 4090 nai4 1474 +奉 5050 feng4 1294 +奊 2480 xie2 +奋奮 4060 fen4 1194 +奌 2180 dian3 +奍 9022 quan1juan4 +奎 4010 kui2 2782 +奏 5080 zou4 1516 +奐奂 2780 huan4 +契 5780 qi4qie4xie4 2105 +奒 4080 kai1 +奓 4020 she1chi3zha4 +奔 4044 ben1ben4 1089 +奕 0080 yi4 2942 +奖奬 3780 jiang3 1460 +套 4073 tao4 kit 846 +奘 2480 zang4zhuang3 +奙 2371 ben3 +奚 2080 xi1xi2 2968 +奛 4062 xiang3 +奜 1180 fei3 +奝 4022 diao1 +奞 4021 xun4 +奟 4022 keng1 +奠 8080 dian4 2523 +奡 1022 ao4 +奢 4060 she1 2754 +奣 1062 weng3 +奤 4060 pan3ha3tai3 +奥奧 2780 ao4 1395 +奦 1780 wu4 +奧奥 2780 ao4yu4 +奨 3280 jiang3 +奩奁 4071 lian2 +奪夺 4034 duo2 +奫 4012 yun1 +奬奖 2780 jiang3 +奭 4080 shi4 +奮奋 4060 fen4 +奯 4025 huo4 +奰 6080 bi4 +奱 2280 lian2 +奲 4665 duo3 +女 4040 nv3 u female 256 +奴 4744 nu2 1848 +奵 4142 ding1 +奶 4742 nai3 breast milk 1115 +奷 4244 qian1 +奸姦 4144 jian1 adultery fuck 2082 +她 4441 ta1 she 322 +奺 4748 jiu3 +奻 4444 nan2 +奼姹 4241 cha4 +好 4744 hao3hao4 good 55 +奾 4247 xian1 +奿 5401 fan4 +妀 1474 ji3 +妁 4742 shuo4 +如 4640 ru2 62 +妃 4741 fei1pei4 2626 +妄 0040 wang4 2347 +妅 4141 hong2 +妆妝 3414 zhuang1 2254 +妇婦 4747 fu4 724 +妈媽 4742 ma1 mom mother 968 +妉 4441 dan1 +妊 4241 ren4 +妋 4548 fu1 +妌 4540 jing4 +妍 4144 yan2 3301 +妎 4842 xie4 +妏 4044 wen4 +妐 4843 zhong1 +妑 4741 pa1 +妒 4340 du4 2544 +妓 4444 ji4 2531 +妔 4041 keng1 +妕 4540 zhong4 +妖 4248 yao1 2090 +妗 4842 jin4 +妘 4143 yun2 +妙 4942 miao4 good 1202 +妚 4149 pei1 +妛 2240 chi1 +妜 4548 yue4 +妝妆 2424 zhuang1 +妞 4741 niu1 3279 +妟 6040 yan4 +妠 4442 na4 +妡 4242 xin1 +妢 4842 fen2 +妣 4241 bi3 +妤 4742 yu2 +妥 2040 tuo3 1906 +妦 4540 feng1 +妧 4141 yuan2 +妨 4042 fang2 1799 +妩嫵 4141 wu3 3765 +妪嫗 4141 yu4yu3 +妫媯 4442 gui1 +妬 4146 du4 +妭 4344 ba2 +妮 4741 ni1ni2 2209 +妯 4546 zhou2zhu2 +妰 4841 zhuo2 +妱 4746 zhao1 +妲 4641 da2 +妳 4749 ni3 you 5000 +妴 2740 yuan3 +妵 4041 tou3 +妶 4043 xuan2 +妷 4548 zhi2 +妸 4142 e1 +妹 4549 mei4 1126 +妺 4549 mo4 +妻 5040 qi1qi4 987 +妼 4340 bi4 +妽 4540 shen1 +妾 0040 qie4 concubine 2944 +妿 4640 e1 +姀 4249 he2 +姁 4742 xu3xu1 +姂 4243 fa2 +姃 4141 zheng1 +姄 4744 min2 +姅 4945 ban4 +姆 4745 mu3 1894 +姇 2440 fu1 +姈 4842 ling2 +姉 4042 zi3 +姊 4042 zi3 2127 +始 4346 shi3 348 +姌 4544 ran3 +姍姗 4744 shan1 +姎 4548 yang1 +姏 4447 man2 +姐 4741 jie3 836 +姑 4446 gu1 954 +姒 4840 si4 +姓 4541 xing4 876 +委 2040 wei3wei1 687 +姕 2240 zi1 +姖 4141 ju4 +姗姍 4744 shan1 3441 +姘 4844 pin1 +姙 4241 ren4 +姚 4241 yao2 2092 +姛 4742 tong3 +姜 8040 jiang1 ginger 1721 +姝 4549 shu1 +姞 4446 ji2 +姟 4048 gai1 +姠 4742 shang4 +姡 4246 kuo4 +姢 4342 juan1 +姣 4044 jiao1jiao3xiao2 3979 +姤 4246 gou4 +姥 4441 mu3lao3 2764 +姦奸 4044 jian1 fuck 5000 +姧 4144 jian1 +姨 4548 yi2 2231 +姩 4845 nian4 +姪 4141 zhi2 +姫 4141 ji1 +姬 4141 ji1 2398 +姭 4740 xian4 +姮 4141 heng2 +姯 4941 guang1 +姰 4742 jun1 +姱 4442 kua1 +姲 4344 yan4 +姳 4746 ming3 +姴 1240 lie4 +姵 4741 pei4 +姶 4846 yan3 +姷 4442 you4 +姸 4144 yan2 +姹奼 4341 cha4 +姺 4441 shen1xian1 +姻 4640 yin1 2178 +姼 4742 chi3 +姽 4741 gui3 +姾 4841 quan1 +姿 3740 zi1 1641 +娀 4345 song1 +威 5320 wei1 718 +娂 4448 hong2 +娃 4441 wa2 baby 1977 +娄婁 9040 lou2 3070 +娅婭 4141 ya4 3440 +娆嬈 4541 rao3rao2 +娇嬌 4242 jiao1 1863 +娈孌 0040 luan2lian4 +娉 4542 ping1 +娊 4641 xian4 +娋 4942 shao4 +娌 4641 li3 +娍 4345 cheng2 +娎 5240 xiao4xie1 +娏 4341 mang2 +娐 4244 fu1 +娑 3940 suo1 +娒 4845 wu3 +娓 4741 wei3 3937 +娔 4441 ke4 +娕 4549 lai4 +娖 4648 chuo4 +娗 4244 ding4 +娘 4343 niang2 mother 886 +娙 4141 xing2 +娚 4642 nan2 +娛娱 4648 yu2 +娜 4742 nuo2na4 1702 +娝 4146 pei1 +娞 4244 nei3 +娟 4642 juan1 2607 +娠 4143 shen1 +娡 4443 zhi4 +娢 4846 han2 +娣 4842 di4 3826 +娤 2440 zhuang1 +娥 4345 e2 2804 +娦 4248 pin2 +娧 4841 tui4 +娨 4644 han4 +娩 4741 mian3wan3 +娪 4146 wu2 +娫 4244 yan2 +娬 4344 wu3 +娭 4348 xi1ai1 +娮 4046 yan2 +娯 4648 yu2 +娰 4840 si4 +娱娛 4648 yu2 2334 +娲媧 4642 wa1 +娳 4240 li4 +娴嫻 4742 xian2 3266 +娵 4744 ju1 +娶 1740 qu3 2252 +娷 4241 shui4 +娸 4448 qi1 +娹 4043 xian2 +娺 4744 zhui1 +娻 4549 dong1 +娼 4646 chang1 3254 +娽 4749 lu4 +娾 4141 ai3 +娿 7140 e1 +婀 4142 e1 +婁娄 5040 lou2 +婂 4742 mian2 +婃 4349 cong2 +婄 4046 pou3 +婅 4742 ju2 +婆 3440 po2 1264 +婇 4249 cai3 +婈 4444 ding2 +婉 4341 wan3 1992 +婊 4543 biao3 +婋 4141 xiao1 +婌 4744 shu3 +婍 4442 qi3 +婎 4041 hui1 +婏 4741 fu4 +婐 4649 e1wo3 +婑 4244 wo3 +婒 4948 tan2 +婓 1140 fei1 +婔 4141 fei1 +婕 4548 jie2 +婖 4243 tian1 +婗 4741 ni2 +婘 4941 quan2juan4 +婙 4745 jing4 +婚 4246 hun1 1112 +婛 4049 jing1 +婜 7740 qian1 +婝 4348 dian4 +婞 4444 xing4 +婟 4640 hu4 +婠 4347 wa4wan1 +婡 4449 lai2 +婢 4644 bi4 3313 +婣 4240 yin1 +婤 4742 zhou1chou1 +婥 4144 chuo4 +婦妇 4742 fu4 +婧 4542 jing4 +婨 4842 lun2 +婩 6244 yan4 +婪 4440 lan2 3048 +婫 4641 kun1 +婬 4241 yin2 +婭娅 4141 ya4 +婮 4746 ju1 +婯 1140 li4 +婰 4548 dian3 +婱 1040 xian2 +婲 4441 hua1 +婳嫿 4147 hua4 +婴嬰 7740 ying1 infant 2356 +婵嬋 4845 chan2 +婶嬸 4345 shen3 2792 +婷 4042 ting2 3013 +婸 4642 dang4 +婹 4144 yao3 +婺 1840 wu4 +婻 4442 nan4 +婼 4446 ruo4chuo4 +婽 4744 jia3 +婾 4843 tou1yu2 +婿 4742 xu4 2645 +媀 4642 yu2 +媁 4745 wei1 +媂 4042 ti2 +媃 4749 rou2 +媄 4848 mei3 +媅 4441 dan1 +媆 4148 ruan3 +媇 4049 qin1 +媈 4745 hui1 +媉 4741 wu1 +媊 4842 qian2 +媋 4546 chun1 +媌 4446 mao2miao2 +媍 4748 fu4 +媎 4446 jie3 +媏 4242 duan1 +媐 7740 xi1 +媑 4241 zhong4 +媒 4449 mei2 1688 +媓 4641 huang2 +媔 4146 mian2 +媕 4844 an1 +媖 4448 ying1 +媗 4341 xuan1 +媘 4246 jie1 +媙 4345 wei1 +媚 4746 mei4 2085 +媛 4244 yuan4yuan2 3184 +媜 5148 zhen1 +媝 2940 qiu1 +媞 4648 ti2di4 +媟 4449 xie4 +媠 4442 tuo3duo4 +媡 4549 lian4 +媢 4646 mao4 +媣 4449 ran3 +媤 4643 si1 +媥 4242 pian1 +媦 4642 wei4 +媧娲 4742 wa1 +媨 4846 jiu4 +媩 4742 hu2 +媪媼 4641 ao3 +媫 4148 jie2 +媬 4649 bao3 +媭 2140 xu1 +媮 4842 tou1yu2 +媯妫 4242 gui1 +媰㛀 4742 zou1 +媱 4747 yao2 +媲 4641 pi4 3893 +媳 4643 xi2 2293 +媴 4443 yuan2 +媵 7924 ying4 +媶 4444 rong2 +媷 4144 ru4 +媸 4743 chi1 +媹 4746 liu2 +媺 4844 mei3 +媻 2740 pan2 +媼媪 4641 ao3 +媽妈 4142 ma1 +媾 4545 gou4 +媿 4641 kui4gui3 +嫀 4549 qin2 +嫁 4343 jia4 1583 +嫂 4744 sao3 1980 +嫃 4448 zhen1 +嫄 4149 yuan2 +嫅 4841 cha1 +嫆 4346 yong2 +嫇 4748 ming2 +嫈 9940 ying1 +嫉 4048 ji2 2734 +嫊 4549 su4 +嫋 4742 niao3 +嫌 4843 xian2 1690 +嫍 4247 tao1 +嫎 4042 pang2 +嫏 4742 lang2 +嫐 4444 nao3 +嫑 1040 bao2 +嫒嬡 4244 ai4 +嫓 4741 pi4 +嫔嬪 4348 pin2 +嫕 4143 yi4 +嫖 4149 piao4piao1 3483 +嫗妪 4141 yu4yu3 +嫘 4649 lei2 +嫙 4848 xuan2 +嫚 4644 man4 +嫛 7740 yi1 +嫜 4044 zhang1 +嫝 4049 kang1 +嫞 4042 yong2 +嫟 4141 ni4 +嫠 5824 li2 +嫡 4042 di2 3771 +嫢 5640 gui1 +嫣 4142 yan1 3239 +嫤 4441 jin4 +嫥 4544 zhuan1 +嫦 4942 chang2 +嫧 4548 ce4 +嫨 4448 han1 +嫩 4844 nen4 2211 +嫪 4742 lao4 +嫫 4448 mo2 +嫬 4043 zhe1 +嫭 4144 hu4 +嫮 4142 hu4 +嫯 4840 ao4 +嫰 4748 nen4 +嫱嬙 4446 qiang2 +嫲 4044 ma1ma2 +嫳 9840 pie4 +嫴 4444 gu1 +嫵妩 4843 wu3 +嫶 4043 jiao2 +嫷 4442 tuo3 +嫸 4846 zhan3 +嫹 4448 mao2 +嫺 4742 xian2 +嫻娴 4742 xian2 +嫼 4643 mo4 +嫽 4449 liao2 +嫾 4945 lian2 +嫿婳 4541 hua4 +嬀妫 4242 gui1 +嬁 4741 deng1 +嬂 4345 zhi1 +嬃 2140 xu1 +嬄 4441 yi1 +嬅 4445 hua2 +嬆 4842 xi1 +嬇 4548 hui4 +嬈娆 4441 rao3rao2yao3 +嬉 4446 xi1 3361 +嬊 4440 yan4 +嬋婵 4645 chan2 +嬌娇 4242 jiao1 +嬍 4844 mei3 +嬎 4541 fan4 +嬏 4246 fan1 +嬐 4848 xian1 +嬑 4043 yi4 +嬒 4846 wei4 +嬓 4844 jiao4 +嬔 4541 fu4 +嬕 4644 shi4 +嬖 7040 bi4 +嬗 4041 shan4 +嬘 4843 sui4 +嬙嫱 4446 qiang2 +嬚 4043 lian3 +嬛 4643 huan2qiong2 +嬜 0740 xin1 +嬝 4742 niao3 +嬞 4441 dong3 +嬟 4845 yi4 +嬠 4649 can2 +嬡嫒 4244 ai4 +嬢 4043 niang2 +嬣 4342 neng2 +嬤嬷 4043 ma1 +嬥 4741 tiao3tiao2 +嬦 4444 chou2 +嬧 4541 jin4 +嬨 4443 ci2 +嬩 4748 yu2 +嬪嫔 4348 pin2 +嬫 4949 rong2 +嬬 4142 xu1 +嬭 4142 nai3 +嬮 7140 yan1yan4 +嬯 4441 tai2 +嬰婴 6640 ying1 +嬱 3240 can2 +嬲 6642 niao3 +嬳 4444 yue4 +嬴 0021 ying2 win +嬵 4642 mian2 +嬶 4642 bi2 +嬷嬤 4043 ma1 3816 +嬸婶 4346 shen3 +嬹 4748 xing4 +嬺 4143 ni4 +嬻 4448 du2 +嬼 4240 liu3 +嬽 4248 yuan1 +嬾懒 4748 lan3 +嬿 4443 yan4 +孀 4146 shuang1 +孁 1040 ling2 +孂 4841 jiao3 +孃 4043 niang2 +孄 4742 lan3 +孅 4345 xian1qian1 +孆 4644 ying1 +孇 4044 shuang1 +孈 4242 shuai1 +孉 4441 quan2 +孊 4041 mi3 +孋㛤 4141 li2 +孌娈 2240 luan2lian4 +孍 4644 yan2 +孎 4742 zhu3 +孏 4442 lan3 +子 1740 zi3zi5 u 31 +孑 1740 jie2 +孒 1721 jue2 +孓 1740 jue2 +孔 1241 kong3 1004 +孕 1740 yun4 2399 +孖 1744 zi1ma1 +字 3040 zi4 word 280 +存 4024 cun2 447 +孙孫 1940 sun1xun4 grandson 789 +孚 2040 fu2fu1 3466 +孛 4040 bei4bo2 +孜 1844 zi1 2862 +孝 4440 xiao4 1568 +孞 1733 xin4 +孟 1710 meng4 1279 +孠 1740 si4 +孡 1346 tai1 +孢 1741 bao1 +季 2040 ji4 1260 +孤 1243 gu1 1186 +孥 4740 nu2 +学學 9040 xue2 123 +孧 2440 you4 +孨 1744 zhuan3 +孩 1048 hai2 544 +孪孿 0040 luan2 +孫孙 1249 sun1xun4 +孬 1044 huai4nao1 +孭 1648 mie1 +孮 1349 cong2 +孯 7740 qian1 +孰 0541 shu2 2909 +孱 7724 chan2can4 +孲 1141 ya1 +孳 4440 zi1zi4 +孴 1760 ni3 +孵 7274 fu1 +孶 4440 zi1zi4 +孷 5824 li2 +學学 7740 xue2 +孹 7040 bo4 +孺 1142 ru2ru4 3139 +孻 1541 lai2 +孼 2040 nie4 +孽 4440 nie4 2948 +孾 1644 ying1 +孿孪 2240 luan2 +宀 3032 mian2 u +宁寧 3020 ning2 870 +宂 3021 rong3 +它 3071 ta1tuo1 it 281 +宄 3041 gui3 +宅 3071 zhai2 1581 +宆 3002 qiong2 +宇 3040 yu3 1235 +守 3034 shou3shou4 739 +安 3040 an1 172 +宊 3080 tu2 +宋 3090 song4 1193 +完 3021 wan2 258 +宍 3080 rou4 +宎 3080 yao3yao1yao4 +宏 3043 hong2 macro 1526 +宐 3010 yi2 +宑 3055 jing3 +宒 3071 zhun1 +宓 3033 mi4fu2 +宔 3010 zhu3 +宕 3060 dang4 +宖 3023 hong2 +宗 3090 zong1 831 +官 3077 guan1 491 +宙 3060 zhou4 2492 +定 3080 ding4 68 +宛 3021 wan3yuan1 2319 +宜 3010 yi2 1139 +宝寶 3010 bao3 575 +实實 3080 shi2 85 +実 3080 shi2 +宠寵 3041 chong3 2342 +审審 3050 shen3 1166 +客 3060 ke4 334 +宣 3010 xuan1 809 +室 3010 shi4 578 +宥 3022 you4 +宦 3071 huan4 3277 +宧 3071 yi2 +宨 3011 tiao3 +宩 3090 shi3 +宪憲 3021 xian4 constitution 2212 +宫宮 3060 gong1 palace 917 +宬 3025 cheng2 +宭 3060 qun2 +宮宫 3060 gong1 +宯 3040 xiao1 +宰 3040 zai3 2001 +宱 3022 zha4 +宲 3090 bao3 +害 3060 hai4he2 550 +宴 3040 yan4 1767 +宵 3022 xiao1 2738 +家 3023 jia1 home family 47 +宷 3090 shen3 +宸 3023 chen2 +容 3060 rong2 321 +宺 3021 huang3 +宻 3077 mi4 +宼 3021 kou4 +宽寬 3021 kuan1 wide width 1030 +宾賓 3080 bin1bin4 1369 +宿 3026 su4xiu3xiu4 1413 +寀 3090 cai4 +寁 3080 zan3jie2 +寂 3094 ji4 1507 +寃 3021 yuan1 +寄 3062 ji4 1359 +寅 3080 yin2 3181 +密 3077 mi4 thick 568 +寇 3021 kou4 2495 +寈 3022 qing1 +寉 3021 que4 +寊 3080 zhen1 +寋 3071 jian3 +富 3060 fu4 rich 714 +寍 3010 ning2ning4 +寎 3022 bing4 +寏 3080 huan2 +寐 3029 mei4 3407 +寑 3024 qin3 +寒 3030 han2 1138 +寓 3022 yu4 2191 +寔 3080 shi2 +寕 3020 ning2ning4 +寖 3014 jin4qin4 +寗 3044 ning2ning4 +寘 3080 zhi4 +寙 3023 yu3 +寚 3077 bao3 +寛 3021 kuan1 +寜 3020 ning2ning4 +寝寢 3014 qin3 2697 +寞 3080 mo4 2392 +察 3090 cha2 712 +寠 3040 ju4lou2 +寡 3022 gua3 2070 +寢寝 3024 qin3 +寣 3026 hu1 +寤 3026 wu4 +寥 3020 liao2 2778 +實实 3080 shi2 +寧宁 3020 ning2ning4zhu4 +寨 3090 zhai4 2109 +審审 3060 shen3 +寪 3022 wei3 +寫写 3032 xie3 +寬宽 3021 kuan1 +寭 3033 hui4 +寮 3090 liao2 +寯 3022 jun4 +寰 3073 huan2 3269 +寱 3029 yi4 +寲 3088 yi2 +寳 3080 bao3 +寴 3091 qin4 +寵宠 3021 chong3 +寶宝 3080 bao3 +寷 3010 feng1 +寸 4030 cun4 u 1512 +对對 7440 dui4 yes pair 28 +寺 4034 si4 1775 +寻尋 1734 xun2 find 738 +导導 7734 dao3dao4 728 +寽 2034 lv4 +対 0440 dui4 +寿壽 5034 shou4 1498 +尀 7470 po3 +封 4410 feng1 791 +専 5034 zhuan1 +尃 5334 fu1 +射 2420 she4yi4ye4 897 +尅 4421 ke4 +将將 3214 jiang1jiang4 will 93 +將将 2724 jiang1jiang4 +專专 5034 zhuan1 +尉 7420 wei4yu4 2117 +尊 8034 zun1 1047 +尋寻 1734 xun2xin2 +尌 4410 shu4 +對对 3410 dui4 +導导 3834 dao3dao4 +小 9000 xiao3 u little small 56 +尐 9030 ji1 +少 9020 shao3shao4 little 164 +尒 8090 er3 +尓 8090 er3 +尔爾 2790 er3 456 +尕 1790 ga3 +尖 9080 jian1 sharp 1306 +尗 2190 shu2 +尘塵 9010 chen2 dust dirt 1422 +尙 9022 shang4chang2 +尚 9022 shang4 693 +尛 9099 mo2 +尜 9090 ga2 +尝嘗 9073 chang2 taste 1237 +尞 4090 liao4liao2 +尟 8980 xian3 +尠 4972 xian3 +尡 9621 hun4 +尢 4001 wang1you2 u +尣 8021 wang1 +尤 4301 you2 1020 +尥 4701 liao4 +尦 8721 liao4 +尧堯 5021 yao2 2383 +尨 4301 long2mang2meng2pang2 +尩 8121 wang1 +尪 4101 wang1 +尫 1121 wang1 +尬 4801 ga4 2840 +尭 4021 yao2 +尮 4701 duo4 +尯 4701 kui4kui3 +尰 4201 zhong3 +就 0391 jiu4 32 +尲 4801 gan1 +尳 4701 gu3 +尴尷 4801 gan1 2843 +尵 4501 tui2 +尶 4801 gan1 +尷尴 4801 gan1 +尸屍 7720 shi1 u corpse 1645 +尹 1750 yin3 2143 +尺 7780 chi3che3 1379 +尻 7721 kao1 +尼 7721 ni2 955 +尽儘 7730 jin4jin3 384 +尾 7721 wei3yi3 1401 +尿 7729 niao4sui1 2724 +局 7722 ju2 554 +屁 7721 pi4 2568 +层層 7723 ceng2 floor layer 702 +屃屓 7728 xi4 +屄 7728 bi1 pussy cunt crack vagina 5000 +居 7726 ju1 549 +屆届 7727 jie4 +屇 7726 tian2 +屈 7727 qu1 1485 +屉屜 7721 ti4 drawer 3322 +届屆 7726 jie4 2028 +屋 7721 wu1 823 +屌 7722 diao3 penis 5000 +屍尸 7721 shi1 +屎 7729 shi3 3468 +屏 7724 ping2bing3 1524 +屐 7724 ji1 +屑 7722 xie4 2659 +屒 7723 chen2 +屓屃 7728 xi4 +屔 0711 ni2 +展 7723 zhan3 405 +屖 7724 xi1 +屗 7421 u1 +屘 7721 man3 +屙 7722 e1 +屚 7722 lou4 +屛 7724 ping2bing3 +屜屉 7721 ti4 +屝 7721 fei4 +属屬 7722 shu3zhu3 belong 648 +屟 7724 xie4 +屠 7726 tu2 2040 +屡屢 7724 lv3 2430 +屢屡 7724 lv3 +屣 7728 xi3 +層层 7726 ceng2 +履 7724 lv3 1983 +屦屨 7724 ju4 +屧 7729 xie4 +屨屦 7724 ju4 +屩 7722 jue1 +屪 7729 liao2 +屫 7722 jue2 +屬属 7722 shu3zhu3 +屭 7728 xi4 +屮 2240 che4cao3 u +屯 5071 tun2zhun1 2796 +屰 8040 ni4 +山 2277 shan1 u mountain hill 217 +屲 2077 wa1 +屳 8077 xian1 +屴 2222 li4le4 +屵 2220 xue1 +屶 2222 hui4 +屷 2772 hui4 +屸 2171 long2 +屹 2871 yi4 3512 +屺 2771 qi3 +屻 2772 ren4 +屼 2171 wu4 +屽 2174 han4 +屾 2277 shen1 +屿嶼 2172 yu3xu4 3630 +岀 2277 chu1 +岁歲 2220 sui4 662 +岂豈 2271 qi3kai3 1644 +岃 2232 ren4 +岄 2772 yue4 +岅 2274 ban3 +岆 2278 yao3 +岇 2272 ang2 +岈 2174 ya2 +岉 2772 wu4 +岊 7777 jie2 +岋 2774 e4 +岌 2224 ji2 +岍 2174 qian1 +岎 2872 fen1 +岏 2171 yuan2 +岐 2474 qi2 3493 +岑 2220 cen2 3261 +岒 2872 qian2 +岓 2272 qi2 +岔 8077 cha4 2732 +岕 2222 jie4 +岖嶇 2171 qu1 3948 +岗崗 2222 gang1 1940 +岘峴 2771 xian4 +岙嶴 2077 ao4 +岚嵐 2221 lan2 2666 +岛島 2772 dao3 island 1342 +岜 2271 ba1 +岝 2281 zuo4 +岞 2871 zuo4 +岟 2578 yang3 +岠 2171 ju4 +岡冈 7722 gang1 +岢 2262 ke3 +岣 2772 gou3 +岤 2378 xue4 +岥 2474 po1 +岦 2210 li4 +岧 2260 tiao2 +岨 2771 ju1ju3 +岩 2260 yan2 1676 +岪 2252 fu2 +岫 2576 xiu4 +岬 2675 jia3 +岭嶺 2872 ling3 1849 +岮 2371 tuo2 +岯 2171 pei1pei2 +岰 2472 you3 +岱 2377 dai4 3318 +岲 2671 kuang4 +岳 7277 yue4 1589 +岴 2271 qu1 +岵 2476 hu4 +岶 2670 po4 +岷 2774 min2 +岸 2224 an4 1221 +岹 2776 tiao2 +岺 2230 ling2 +岻 2274 chi2 +岼 2174 ping2 +岽崬 2290 dong1 +岾 2176 zhan1 +岿巋 2227 kui1 +峀 2260 xiu4 +峁 2272 mao3 +峂 2773 tong2 +峃 9077 xue2 +峄嶧 2775 yi4 +峅 2374 bian4 +峆 2876 he1 +峇 2260 ke1ba1 +峈 2776 luo4 +峉 2260 e1e4 +峊 2777 fu4nie4 +峋 2772 xun2 +峌 2171 die2 +峍 2570 lu4 +峎 2273 an1 +峏 2172 er3 +峐 2078 gai1 +峑 2210 quan2 +峒 2772 tong2dong4 +峓 2578 yi2 +峔 2471 mu3 +峕 2260 shi2 +峖 2374 an1 +峗 2771 wei2 +峘 2171 hu1huan2 +峙 2474 zhi4shi4 3169 +峚 2210 mi4 +峛 2222 li3 +峜 2210 ji1 +峝 2222 tong2dong4 +峞 2271 wei2 +峟 2242 you4 +峠 2173 qia3 +峡峽 2578 xia2 gorge 2049 +峢 2270 li3 +峣嶢 2571 yao2 +峤嶠 2272 jiao4qiao2 +峥崢 2775 zheng1 +峦巒 0077 luan2 3679 +峧 2074 jiao1 +峨 2375 e2 3072 +峩 2255 e2 +峪 2876 yu4 +峫 2772 ye2 +峬 2372 bu1 +峭 2972 qiao4 3284 +峮 2776 qun1 +峯 2250 feng1 +峰 2775 feng1 peak 1204 +峱 4727 nao2 +峲 2292 li3 +峳 2224 you2 +峴岘 2671 xian4 +峵 2373 hong2 +島岛 2772 dao3 +峷 2240 shen1 +峸 2375 cheng2 +峹 8077 tu2 +峺 2174 geng3 +峻 2374 jun4 2218 +峼 2476 hao4 +峽峡 2478 xia2 +峾 3277 yin1yin2 +峿 2176 yu3wu2 +崀 2273 lang4 +崁 2218 kan3 +崂嶗 2472 lao2 +崃崍 2579 lai2 +崄嶮 2871 xian3 +崅 2772 que4 +崆 2371 kong1 +崇 2290 chong2 1587 +崈 8077 chong2 +崉 2276 ta4 +崊 2479 lin2 +崋 2250 hua2 +崌 2726 ju1 +崍崃 2479 lai2 +崎 2472 qi2 3156 +崏 2276 min2 +崐 2671 kun1 +崑 2271 kun1 +崒 2240 zu2cui4 +崓 2670 gu4 +崔 2221 cui1 1860 +崕 2171 ya2yai2 +崖 2221 ya2yai2 2329 +崗岗 2222 gang3gang1 +崘 2872 lun2 +崙 2222 lun2 +崚 2474 leng2 +崛 2777 jue2 3555 +崜 2271 duo1 +崝 2572 zheng1 +崞 2074 guo1 +崟 2210 yin2 +崠 2579 dong1dong4 +崡 2777 han2 +崢峥 2275 zheng1 +崣 2240 wei3 +崤 2472 yao2 +崥 2674 pi3 +崦 2471 yan1 +崧 2293 song1 +崨 2578 jie2 +崩 2222 beng1 collapse 2341 +崪 2074 zu2cui4 +崫 2227 jue2 +崬岽 2290 dong1 +崭嶄 2252 zhan3 3003 +崮 2260 gu4 +崯 2871 yin2 +崰 2276 zi1 +崱 2282 ze2ze4 +崲 2671 huang2 +崳 2872 yu2 +崴 2225 wei1 +崵 2672 yang2 +崶 2214 feng1 +崷 2876 qiu2 +崸 2178 dun4 +崹 2072 ti2 +崺 2221 yi3 +崻 2474 zhi4 +崼 2678 shi4 +崽 2233 zai3 3869 +崾 2174 yao3 +崿 2672 e4 +嵀 2291 zhu4 +嵁 2471 kan1 +嵂 2225 lv4 +嵃 2072 yan3 +嵄 2878 mei3 +嵅 2225 gan1 +嵆 2377 ji1 +嵇 2397 ji1xi2 3657 +嵈 2274 huan3 +嵉 2072 ting2 +嵊 2279 sheng4 +嵋 2776 mei2 +嵌 2278 qian4qian1 2391 +嵍 1877 wu4 +嵎 2672 yu2 +嵏 2240 zong1 +嵐岚 2221 lan2 +嵑 2672 jue2he2jie2 +嵒 6077 yan2 +嵓 2266 yan2 +嵔 2273 wei3wei4 +嵕 2274 zong1 +嵖 2471 cha2 +嵗 2225 sui4 +嵘嶸 2479 rong2 +嵙 2294 ke1 +嵚嶔 2278 qin1 +嵛 2222 yu2 +嵜 2262 qi2 +嵝嶁 2974 lou3lv3 +嵞 8077 tu2 +嵟 2221 dui1 +嵠 2278 xi1ji1qi1 +嵡 2212 weng1 +嵢 2876 cang1 +嵣 2076 dang1 +嵤 9977 hong2 +嵥 2579 jie2 +嵦 2271 ai2 +嵧 2776 liu2 +嵨 2772 wu3 +嵩 2222 song1 3523 +嵪 2072 qiao1 +嵫 2873 zi1 +嵬 2221 wei2 +嵭 2072 beng1 +嵮 2478 dian1 +嵯 2871 cuo2ci1 +嵰 2873 qian3 +嵱 2376 yong3 +嵲 2679 nie4 +嵳 2221 cuo2ci1 +嵴 2972 ji2 +嵵 2264 shi2 +嵶 2772 ruo4 +嵷 2878 song3 +嵸 2228 zong1 +嵹 2223 jiang4qiang2 +嵺 2772 liao2 +嵻 2079 kang1 +嵼 2071 chan3 +嵽 2472 die2di4 +嵾 2220 cen1 +嵿 2228 ding3 +嶀 2177 tu1 +嶁嵝 2574 lou3lv3 +嶂 2074 zhang4 +嶃 2272 zhan3 +嶄崭 2252 zhan3 +嶅 5877 ao2 +嶆 2476 cao2 +嶇岖 2171 qu1 +嶈 2224 qiang1 +嶉 2261 zui1 +嶊 2251 zui3 +嶋 2772 dao3 +嶌 2232 dao3 +嶍 2776 xi2 +嶎 2224 yu4 +嶏 2221 bo2 +嶐 2221 long2 +嶑 2773 xiang3 +嶒 2876 ceng2 +嶓 2276 bo1 +嶔嵚 2218 qin1 +嶕 2073 jiao1 +嶖 2872 yan3 +嶗崂 2972 lao2 +嶘 2295 zhan4 +嶙 2975 lin2 +嶚 2290 liao2 +嶛 2479 liao2 +嶜 2260 jin1 +嶝 2271 deng4 +嶞 7477 duo4 +嶟 2874 zun1 +嶠峤 2272 jiao4qiao2 +嶡 2228 gui4 +嶢峣 2471 yao2 +嶣 2233 qiao2 +嶤 2211 yao2 +嶥 2178 jue2 +嶦 2776 zhan1 +嶧峄 2674 yi4 +嶨 7777 xue2 +嶩 2573 nao2 +嶪 2290 ye4 +嶫 2279 ye4 +嶬 2875 yi2 +嶭 2274 e4nie4 +嶮崄 2878 xian3 +嶯 2215 ji2 +嶰 2775 xie4 +嶱 2472 ke3ge2 +嶲 2222 xi1 +嶳 2211 di4 +嶴岙 2777 ao4 +嶵 2671 zui3 +嶶 2224 wei2 +嶷 2288 yi2ni4 +嶸嵘 2979 rong2 +嶹 2474 dao3 +嶺岭 2238 ling3 +嶻 2225 za2 +嶼屿 2778 yu3xu4 +嶽 2228 yue4 +嶾 2273 yin3 +嶿 2472 ru1 +巀 2225 jie1 +巁 2172 li4 +巂 2222 sui3gui1 +巃 2221 long2 +巄 2171 long2 +巅巔 2288 dian1 summit 3633 +巆 2976 ying2 +巇 2375 xi1 +巈 2252 ju2 +巉 2771 chan2 +巊 2674 ying3 +巋岿 2212 kui1 +巌 2224 yan2 +巍 2241 wei1 2646 +巎 2174 nao2 +巏 2471 quan2 +巐 2224 chao3 +巑 2478 cuan2 +巒峦 2277 luan2 +巓 2288 dian1 +巔巅 2288 dian1 +巕 2474 nie4 +巖 2224 yan2 +巗 2674 yan2 +巘 2378 yan3 +巙 2874 nao2 +巚 2228 yan3 +巛 2233 chuan1kun1 u +巜 2233 gui4kuai4 +川 2200 chuan1 river 1155 +州 3200 zhou1 state 688 +巟 0021 huang1 +巠 1010 jing1 +巡 3230 xun2 1574 +巢 2290 chao2 nest 2632 +巣 9090 chao2 +巤 2271 lie1 +工 1010 gong1 u 202 +左 4001 zuo3 left 611 +巧 1112 qiao3 1091 +巨 7171 ju4 1017 +巩鞏 1711 gong3 2839 +巪 7102 ju4 +巫 1010 wu1wu2 2445 +巬 1780 gu1 +巭 1480 gu1 +差 8021 cha4chai1 556 +巯巰 1011 qiu2 +巰巯 1011 qiu2 +己 1771 ji3 u 189 +已 1771 yi3 78 +巳 7771 si4 3219 +巴 7771 ba1 620 +巵 7221 zhi1 +巶 1761 zhao1zhao4 +巷 4471 xiang4hang4 2238 +巸 7771 yi2 +巹 1771 jin3 +巺 7780 xun4 +巻 9071 juan4juan3 +巼 7761 phas +巽 7780 xun4 +巾 4022 jin1 u 1916 +巿 5022 fu2 +帀 1022 za1 +币幣 2022 bi4 1963 +市 0022 shi4 city 482 +布 4022 bu4 400 +帄 4122 ding1 +帅帥 2402 shuai4 2000 +帆 4721 fan1 sail 2265 +帇 5022 nie4 +师師 2102 shi1 318 +帉 4822 fen1 +帊 4721 pa4 +帋 7222 zhi3 +希 4022 xi1 516 +帍 3022 hu4 +帎 4421 dan4 +帏幃 4522 wei2 +帐帳 4223 zhang4 1287 +帑 4722 tang3nu2 +帒 2322 dai4 +帓 4529 ma4 +帔 4424 pei4 +帕 4620 pa4 2035 +帖 4126 tie4tie3tie1 2572 +帗 4324 fu2 +帘簾 3022 lian2 2111 +帙 4528 zhi4 +帚 1722 zhou3 3805 +帛 2622 bo2 3618 +帜幟 4628 zhi4 flag 2857 +帝 0022 di4 1013 +帞 4126 mo4 +帟 0022 yi4 +帠 7722 yi4 +帡 4824 ping2 +帢 4826 qia4 +帣 9022 juan4 +帤 4622 ru2 +帥帅 2472 shuai4 +带帶 4422 dai4 strap 267 +帧幀 4128 zheng4 frame 3374 +帨 4821 shui4 +帩 4922 qiao4 +帪 4123 zhen1 +師师 2172 shi1 +帬 1722 qun2 +席 0022 xi2 839 +帮幫 5722 bang1 581 +帯 4422 dai4 +帰 2702 gui1 +帱幬 4524 chou2dao4 +帲 4224 ping2 +帳帐 4123 zhang4 +帴 4325 sha1jian1jian3 +帵 4321 wan1 +帶带 4422 dai4 +帷 4021 wei2 3005 +常 9022 chang2 187 +帹 4024 sha4 +帺 4428 qi2 +帻幘 4528 ze2 +帼幗 4620 guo2 +帽 4626 mao4 1770 +帾 4426 du3 +帿 4728 hou2 +幀帧 4128 zheng4 +幁 4128 xu1 +幂冪 3722 mi4 +幃帏 4425 wei2 +幄 4721 wo4 +幅 4126 fu2 1375 +幆 4622 yi4 +幇 4422 bang1 +幈 4724 ping2 +幉 4429 die2 +幊 4108 gong1 +幋 2722 pan2 +幌 4621 huang3 3393 +幍 4227 dao1 +幎 4728 mi4 +幏 4323 jia1jia4 +幐 7922 teng2 +幑 2824 hui1 +幒 4623 zhong1 +幓 4322 shan1 +幔 4624 man4 +幕 4422 mu4 1196 +幖 4129 biao1 +幗帼 4620 guo2 +幘帻 4528 ze2 +幙 4428 mu4 +幚 5722 bang1 +幛 4024 zhang4 +幜 4629 jiong3jing3 +幝 4625 chan3 +幞 4228 fu2 +幟帜 4325 zhi4 +幠 4823 hu1 +幡 4226 fan1 3751 +幢 4021 chuang2zhuang4 2580 +幣币 9822 bi4 +幤 9822 bi4 +幥 4925 zhang3 +幦 7022 mi4 +幧 4629 qiao1 +幨 4726 chan1chan4 +幩 4028 fen2 +幪 4423 meng2meng3 +幫帮 4422 bang1 +幬帱 4424 chou2dao4 +幭 4425 mie4 +幮 4024 chu2 +幯 4822 jie2 +幰 4323 xian3 +幱 4722 lan2 +干乾 1040 gan1gan4 u do dry 275 +平 1040 ping2 153 +年 8050 nian2 year 45 +幵 1044 qian1 +并並 8044 bing4bing1 138 +幷 2244 bing4bing1 +幸 4040 xing4 882 +幹干 4844 gan4han2 +幺么 2073 yao1 u 3727 +幻 2772 huan4 1647 +幼 2472 you4yao4 1609 +幽 2277 you1 1438 +幾几 2225 ji3ji1 +广廣 0020 guang3 u 512 +庀 0021 pi3 +庁 0022 ting1 +庂 0028 ze4 +広 0023 guang3 +庄莊 0021 zhuang1 861 +庅 0023 mo5 +庆慶 0028 qing4 celebrate 1087 +庇 0021 bi4 3128 +庈 0022 qin2 +庉 0021 dun4 +床 0029 chuang2 bed 890 +庋 0024 gui3 +庌 0024 ya3 +庍 0022 bai4 +庎 0022 jie4 +序 0022 xu4 1107 +庐廬 0020 lu2 2849 +庑廡 0021 wu3wu2 +庒 0021 zhuang1 +库庫 0025 ku4 base 1154 +应應 0021 ying4ying1 124 +底 0024 di3de5 464 +庖 0021 pao2 +店 0026 dian4 768 +庘 0025 ya1 +庙廟 0026 miao4 temple 1684 +庚 0028 geng1 2950 +庛 0011 ci1ci4 +府 0024 fu3 501 +庝 0023 tong2 +庞龐 0021 pang2 1648 +废廢 0024 fei4 1447 +庠 0025 xiang2 +庡 0023 yi3 +庢 0021 zhi4 +庣 0021 tiao1 +庤 0024 zhi4 +庥 0029 xiu1 +度 0024 du4duo2 grade degree 236 +座 0021 zuo4 715 +庨 0024 xiao1 +庩 0029 tu2 +庪 0024 gui3ji3 +庫库 0025 ku4 +庬 0021 pang2mang2 +庭 0024 ting2ting4 937 +庮 0026 you3you2 +庯 0022 bu1 +庰 0024 ding1 +庱 0024 cheng3 +庲 0029 lai2 +庳 0024 bei1bi3 +庴 0026 ji2 +庵 0021 an1 3071 +庶 0023 shu4 2910 +康 0023 kang1 850 +庸 0022 yong1yong2 2258 +庹 0023 tuo3 +庺 0029 song1 +庻 0028 shu4zhu4zhe1 +庼 0028 qing3 +庽 0022 yu4 +庾 0028 yu3 +庿 0026 miao4 +廀 0024 sou1 +廁厕 0022 ce4 +廂厢 0026 xiang1 +廃 0021 fei4 +廄厩 0024 jiu4 +廅 0021 he2 +廆 0021 hui4gui1wei3 +廇 0026 liu4 +廈厦 0024 sha4xia4 +廉 0023 lian2 1757 +廊 0022 lang2 1942 +廋 0024 sou1 +廌 0022 zhi4 +廍 0022 pou3 +廎 0028 qing3 +廏 0024 jiu4 +廐 0021 jiu4 +廑 0021 jin3qin2 +廒 0024 ao2 +廓 0022 kuo4 2592 +廔 0024 lou2 +廕 0023 yin4yin1 shade 5000 +廖 0022 liao4 2688 +廗 0022 dai4 +廘 0021 lu4 +廙 0028 yi4 +廚厨 0024 chu2 +廛 0021 chan2 +廜 0026 tu1 +廝厮 0022 si1 +廞 0028 xin1 +廟庙 0022 miao4 +廠厂 0024 chang3 +廡庑 0023 wu3wu2 +廢废 0024 fei4 +廣广 0028 guang3 +廤 0021 ku4 +廥 0026 kuai4 +廦 0024 bi4 +廧 0026 qiang2 +廨 0025 xie4jie4 +廩廪 0029 lin3 +廪廩 0029 lin3bing3lan3 +廫 0022 liao2 +廬庐 0021 lu2 +廭 0028 ji4 +廮 0024 ying2 +廯 0015 xian1 +廰 0023 ting1 +廱 0021 yong1 +廲 0021 li2 +廳厅 0023 ting1 +廴 1740 yin3 u +廵 1240 xun2 +延 1240 yan2 1142 +廷 1240 ting2 1504 +廸 1540 di2 +廹 1640 po4pai3 +建 1540 jian4 419 +廻 1640 hui2 +廼 1140 nai3 +廽 1640 hui2 +廾 4400 gong3gong4nian4 u +廿 4477 nian4 3650 +开開 1044 kai1 open 52 +弁 2344 bian4pan2 +异異 7744 yi4 637 +弃棄 0044 qi4 1140 +弄 1044 nong4long4 1019 +弅 8044 fen2 +弆 4044 ju3 +弇 8044 yan3yan1 +弈 0044 yi4 3915 +弉 2444 zang4zhuang3 +弊 9844 bi4 2421 +弋 4300 yi4 u +弌 4310 yi1 +弍 4310 er4 +弎 4310 san1san4 +式 4310 shi4 410 +弐 1314 er4 +弑弒 4394 shi4 +弒弑 4394 shi4 +弓 1702 gong1 u 2241 +弔 1752 diao4 +引 1220 yin3 387 +弖 1710 hu4 +弗 5502 fu2 2047 +弘 1223 hong2 2431 +弙 1124 wu1 +弚 8052 tui2 +弛 1421 chi2 3186 +弜 1722 jiang4qiang2 +弝 1721 ba4 +弞 1728 shen3 +弟 8022 di4ti4 682 +张張 1223 zhang1 227 +弡 1121 jue2 +弢 1224 tao1 +弣 1424 fu3 +弤 1224 di3 +弥彌 1829 mi2 1762 +弦 1023 xian2 string 2106 +弧 1223 hu2 arch 2863 +弨 1726 chao1 3755 +弩 4702 nu3 3562 +弪弳 1721 jing4 +弫 1121 zhen3 +弬 1121 yi2 +弭 1124 mi3 +弮 9002 quan1 +弯彎 0002 wan1 1596 +弰 1922 shao1 +弱 1712 ruo4 1027 +弲 1622 xuan1 +弳弪 1121 jing4 +弴 1024 dun1 +張张 1123 zhang1 +弶 1029 jiang4 +強强 1323 qiang2qiang3jiang4 +弸 1722 peng2 +弹彈 1825 dan4tan2 1054 +强強 1623 qiang2 260 +弻 1722 bi4 +弼 1722 bi4 3564 +弽 1429 she4 +弾 1925 dan4 +弿 3002 jian3 +彀 4724 gou4 +彁 1122 ge1 +彂 3228 fa1fa4bo1 +彃 1625 bi4 +彄 1121 kou1 +彅 1822 jian3 +彆 9702 bie4 +彇 1522 xiao1 +彈弹 1625 dan4tan2 +彉 1428 kuo4 +彊 1121 qiang2qiang3jiang4 +彋 1623 hong2 +彌弥 1122 mi2 +彍 1028 kuo4 +彎弯 2202 wan1 +彏 1624 jue2 +彐 1717 ji4 u +彑 2710 ji4 +归歸 2707 gui1 return 713 +当噹 9017 dang1 when 75 +彔 2723 lu4 +录錄 1790 lu4lv4 1023 +彖 2723 tuan4 +彗 5517 hui4sui4 +彘 2771 zhi4 +彙汇 2790 hui4wei4 +彚 1790 hui4 +彛 1744 yi2 +彜 2744 yi2 +彝彞 2744 yi2 3798 +彞彝 1744 yi2 +彟 1434 huo4 +彠 1434 huo4 +彡 2020 shan1xian1 u +形 1242 xing2 294 +彣 0240 wen2 +彤 7242 tong2 2861 +彥彦 0022 yan4 +彦彥 0022 yan4 2429 +彧 5310 yu4 +彨 1222 chi1 +彩 2292 cai3 895 +彪 2221 biao1 2939 +彫 7222 diao1 +彬 4292 bin1 2427 +彭 4212 peng2 1972 +彮 3262 yong3 +彯 1292 piao1 +彰 0242 zhang1 2700 +影 6292 ying3 375 +彲彨 1222 chi1 +彳 2020 chi4 u +彴 2722 zhuo2 +彵 2421 tuo3 +彶 2724 ji2 +彷 2022 pang2fang3 3236 +彸 2823 zhong1 +役 2724 yi4 1786 +彺 2121 wang2 +彻徹 2722 che4 1368 +彼 2424 bi3 1222 +彽 2224 chi2 +彾 2822 ling3 +彿 2522 fu2 +往 2021 wang3wang4 296 +征徵 2121 zheng1 894 +徂 2721 cu2 +徃 2521 wang3 +径徑 2721 jing4 path 1153 +待 2424 dai4dai1 438 +徆 2126 xi1 +徇 2722 xun4xun2 3920 +很 2723 hen3 very 146 +徉 2825 yang2 +徊 2620 huai2hui2 2870 +律 2520 lv4 795 +後后 2224 hou4 2996 +徍 2421 wa1 +徎 2621 cheng3 +徏 2122 zhi4 +徐 2829 xu2 1005 +徑径 2121 jing4 +徒 2428 tu2 1094 +従 2828 cong2 +徔 2423 cong2 +徕徠 2529 lai2lai4 +徖 2329 cong2 +得 2624 de2dei3 25 +徘 2121 pai2pei2 2921 +徙 2128 xi3 3843 +徚 2529 dong1 +徛 2422 qi4 +徜 2922 chang2 +徝 2421 zhi4 +從从 2828 cong2 +徟 2722 zhou1 +徠徕 2429 lai2lai4 +御禦 2722 yu4ya4 1653 +徢 2528 xie4 +徣 2426 jie4 +徤 2524 jian4 +徥 2628 chi2 +徦 2724 jia3 +徧 2322 bian4 +徨 2621 huang2 3962 +復复 2824 fu4 +循 2226 xun2 1694 +徫 2425 wei3 +徬 2022 pang2 +徭 2727 yao2 +微 2824 wei1wei2 micro tiny 431 +徯 2223 xi1xi2 +徰 2121 zheng1 +徱 2129 piao4biao1 +徲 2725 chi2 +徳 2423 de2duo2 +徴 2824 zheng1 +徵征 2824 zheng1zhi3 +徶 2824 bie4 +德 2423 de2 356 +徸 2021 chong1 +徹彻 2824 che4 +徺 2421 jiao3 +徻 2826 wei4 +徼 2824 jiao3jiao4 +徽 2824 hui1 2176 +徾 2824 mei2 +徿 2121 long4 +忀 2023 xiang1 +忁 2623 bao4 +忂 2621 qu2 +心 3300 xin1 u heart mind 57 +忄 9000 xin1 +必 3300 bi4 228 +忆憶 9701 yi4 memory 1269 +忇 9402 le4 +忈 1033 ren2 +忉 9702 dao1 +忊 9102 ding4 +忋 9701 gai3 +忌 1733 ji4 1696 +忍 1733 ren3 1033 +忎 2033 ren2 +忏懺 9204 chan4 3575 +忐 2133 tan3 +忑 1033 te4 +忒 4330 te4 3790 +忓 9204 gan1 +忔 9801 qi4yi4 +忕 9408 shi4tai4 +忖 9400 cun3 3047 +志志 4033 zhi4 445 +忘 0033 wang4wang2 826 +忙 9001 mang2 664 +忚 9401 xi1 +忛 9701 fan2 +応 0023 ying1 +忝 2033 tian3 +忞 0033 min2 +忟 9004 min2 +忠 5033 zhong1 1116 +忡 9500 chong1 3379 +忢 1033 wu4 +忣 9704 ji2 +忤 9804 wu3 +忥 8031 xi4 +忦 9802 ye4 +忧憂 9301 you1 1256 +忨 9101 wan4 +忩 8033 cong1 +忪 9803 zhong1song1 +快 9503 kuai4 fast quick 244 +忬 9702 yu4 +忭 9003 bian4 +忮 9404 zhi4 +忯 9204 qi2 +忰 9404 cui4 +忱 9401 chen2 3489 +忲 9403 tai4 +忳 9501 tun2zhun1 +忴 9802 qian2 +念 8033 nian4 452 +忶 9103 hun2 +忷 9207 xiong1 +忸 9701 niu3nv4 +忹 9101 wang3 +忺 9708 xian1 +忻 9202 xin1 3820 +忼 9001 kang1 +忽 2733 hu1 719 +忾愾 9801 kai4 +忿 8033 fen4 2985 +怀懷 9109 huai2 657 +态態 4033 tai4 616 +怂慫 8833 song3 +怃憮 9101 wu3 +怄慪 9101 ou4 +怅悵 9203 chang4 3173 +怆愴 9801 chuang4 3957 +怇 9101 ju4 +怈 9401 yi4 +怉 9701 bao3 +怊 9706 chao1 +怋 9704 min2 +怌 9101 pei1 +怍 9801 zuo4 +怎 8033 zen3 370 +怏 9508 yang4 +怐 9702 kou4 +怑 9905 ban4 +怒 4733 nu4 1158 +怓 9704 nao2 +怔 9101 zheng1 2343 +怕 9600 pa4 634 +怖 9402 bu4 2349 +怗 9106 tie1 +怘 4033 gu4 +怙 9406 hu4 +怚 9701 ju4 +怛 9601 da2 +怜憐 9803 lian2 1619 +思 6033 si1sai1 think thought 249 +怞 9506 chou1you2 +怟 9204 di4 +怠 2333 dai4 3079 +怡 9306 yi2 2611 +怢 9508 tu2tu1 +怣 2533 you2 +怤 2433 fu1 +急 2733 ji2 523 +怦 9104 peng1 3623 +性 9501 xing4 sex 180 +怨 2733 yuan4 1394 +怩 9701 ni2 +怪 9701 guai4 869 +怫 9502 fu2 +怬 9600 xi4 +怭 9300 bi4 +怮 9402 you1 +怯 9403 qie4 2648 +怰 9003 xuan4 +怱 2733 cong1 +怲 9102 bing3 +怳 9601 huang3 +怴 9305 xu4 +怵 9309 chu4 +怶 9404 pi1 +怷 4333 xi1 +怸 4333 xi1 +怹 2433 tan1 +怺 9309 yong3 +总總 8033 zong3 198 +怼懟 7433 dui4 +怽 9509 mi4 +怾 9608 gi +怿懌 9705 yi4 +恀 9702 shi4 +恁 2233 ren4 +恂 9702 xun2 +恃 9404 shi4 3203 +恄 9406 xi4 +恅 9401 lao3 +恆恒 9101 heng2 +恇 9101 kuang1 +恈 9305 mu2mou2 +恉 9206 zhi3 +恊 9402 xie2 +恋戀 0033 lian4 1701 +恌 9201 tiao1 +恍 9901 huang3 2435 +恎 9101 die2 +恏 4733 hao3 +恐 1733 kong3 957 +恑 9701 gui3 +恒恆 9101 heng2 permanent 1831 +恓 9106 xi1 +恔 9004 xiao4 +恕 4633 shu4 2500 +恖 2633 si1 +恗 9402 kua3 +恘 9409 qiu1 +恙 8033 yang4 3525 +恚 4033 hui4 +恛 9600 hui2 +恜 9304 chi4 +恝 5733 jia2 +恞 9508 yi2 +恟 9702 xiong1 +恠 9401 guai4 +恡 9403 lin4 +恢 9408 hui1 1420 +恣 3733 zi4 3631 +恤 9701 xu4 3214 +恥耻 1310 chi3 shame disgrace 5000 +恦 9702 xiang4 +恧 1033 nv4 +恨 9703 hen4 hate 1402 +恩 6033 en1 858 +恪 9706 ke4 3693 +恫 9702 tong1dong4 +恬 9206 tian2 3103 +恭 4433 gong1 1918 +恮 9801 quan2 +息 2633 xi1 301 +恰 9806 qia4 1441 +恱 9801 yue4 +恲 9804 peng1 +恳懇 7733 ken3 2401 +恴 0033 de2 +恵 5033 hui4 +恶惡 1033 e4wu4wu1 evil 780 +恷 2433 qiu1 +恸慟 9402 tong4 3918 +恹懨 9108 yan4 +恺愷 9201 kai3 3413 +恻惻 9200 ce4 3712 +恼惱 9007 nao3 1773 +恽惲 9705 yun4 +恾 9401 mang2 +恿 1733 yong3 +悀 9702 yong3 +悁 9602 yuan1juan4 +悂 9201 pi1 +悃 9600 kun3 +悄 9902 qiao3 1360 +悅悦 9801 yue4 +悆 8033 yu4 +悇 9809 yu4tu2 +悈 9305 jie4 +悉 2033 xi1 1346 +悊 5233 zhe2 +悋 9006 lin4 +悌 9802 ti4 +悍 9604 han4 3015 +悎 9406 hao4 +悏 9408 qie4 +悐 4933 ti4 +悑 9302 bu4 +悒 9601 yi4 +悓 9601 qian4 +悔 9805 hui3 1787 +悕 9402 xi1 +悖 9404 bei4bo2 3298 +悗 9701 man2men4 +悘 7133 yi1 +悙 9002 heng1 +悚 9509 song3 3726 +悛 9304 quan1 +悜 9601 cheng3 +悝 9601 kui1li3 +悞悮 9608 wu4 +悟 9106 wu4 1746 +悠 2833 you1 1840 +悡 2233 li2 +悢 9303 liang4 +患 5033 huan4 1531 +悤 2633 cong1 +悥 0033 yi4yi1 +悦悅 9801 yue4 1665 +悧 9200 li4 +您 2733 nin2 you 875 +悩 9907 nao3 +悪 1033 e4 +悫愨 4033 que4 +悬懸 7733 xuan2 hang 1815 +悭慳 9701 qian1 +悮悞 9608 wu4 +悯憫 9702 min3 3157 +悰 9309 cong2 +悱 9101 fei3 +悲 1133 bei1 1168 +悳 4033 duo2 +悴 9004 cui4 3362 +悵怅 9103 chang4 +悶闷 7733 men4 +悷 9308 li4 +悸 9204 ji4 3375 +悹 0033 guan4 +悺 9307 guan4 +悻 9404 xing4 3682 +悼 9104 dao4 2800 +悽 9504 qi1 +悾 9301 kong1 +悿 9203 tian3 +惀 9802 lun3 +惁 4233 xi1 +惂 9707 kan3 +惃 9601 kun1 +惄 2733 ni4 +情 9502 qing2 love 113 +惆 9702 chou2 3747 +惇 9004 dun1 +惈 9609 guo3 +惉 3133 chan1zhan1 +惊驚 9009 jing1 604 +惋 9301 wan3 3471 +惌 3033 yuan1yu4 +惍 9801 jin1 +惎 4433 ji4 +惏 9409 lin2lan2 +惐 7305 yu4 +惑 5333 huo4 1483 +惒 2633 he2 +惓 9901 quan2 +惔 9908 tan2dan4 +惕 9602 ti4 3064 +惖 6033 ti4 +惗 9803 nie1 +惘 9702 wang3 3367 +惙 9704 chuo4 +惚 9703 hu1bu1 3258 +惛 9206 hun1 +惜 9406 xi1 1263 +惝 9902 chang3tang3 +惞 9708 xin1 +惟 9001 wei2 1734 +惠 5033 hui4 1386 +惡恶 1033 e4wu4wu1 +惢 3333 rui3suo3 +惣 2733 zong3 +惤 9003 jian1 +惥 7733 yong3 +惦 9006 dian4 3485 +惧懼 9708 ju4 1873 +惨慘 9302 can3 1616 +惩懲 2133 cheng2 punish discipline 2168 +惪 4033 de2 +惫憊 2733 bei4 3232 +惬愜 9101 qie4 3888 +惭慚 9202 can2 2817 +惮憚 9805 dan4 3448 +惯慣 9708 guan4 1258 +惰 9402 duo4 3420 +惱恼 9206 nao3 +惲恽 9705 yun4 +想 4633 xiang3 think 110 +惴 9202 zhui4 3856 +惵 9409 die4 +惶 9601 huang2 2380 +惷 4033 chun3 +惸 9704 qiong2 +惹 4433 re3 1973 +惺 9601 xing1 3460 +惻恻 9200 ce4 +惼 9302 bian3 +惽 9706 hun1 +惾 9204 zong1 +惿 9608 ti2 +愀 9908 qiao3 +愁 2933 chou2 1658 +愂 4433 bei4 +愃 9301 xuan1xuan3 +愄 9603 wei1 +愅 9405 ge2 +愆 2133 qian1 +愇 9705 wei3 +愈 8033 yu4 1130 +愉 9802 yu2tou1 2115 +愊 9106 bi4 +愋 9204 xuan1 +愌 9708 huan4 +愍 7833 min3 +愎 9804 bi4 +意 0033 yi4 107 +愐 9106 mian3 +愑 9702 yong3 +愒 9602 kai4qi4 +愓 9802 dang4shang1 +愔 9006 yin1 +愕 9602 e4 2781 +愖 9401 chen2 +愗 1833 mou4 +愘 9306 ke4 +愙 3033 ke4 +愚 6033 yu2 2027 +愛爱 2024 ai4 +愜惬 9101 qie4 +愝 9101 yan3 +愞 9108 nuo4 +感 5333 gan3 265 +愠慍 9601 yun4wen3 +愡 9703 zong3 +愢 9603 sai1 +愣 9602 leng4leng2 2404 +愤憤 9408 fen4 1660 +愥 9408 ying1 +愦憒 9508 kui4 +愧 9601 kui4 ashamed 1997 +愨悫 4733 que4 +愩 9108 gong1 +愪 9608 yun2 +愫 9509 su4 +愬 8733 su4shuo4 +愭 9406 qi2 +愮 9707 yao2 +愯 9304 song3 +愰 9601 huang3 +愱 9008 ji2 +愲 9702 gu3 +愳 6633 ju4 +愴怆 9806 chuang4 +愵 9702 ni4 +愶 9402 xie2 +愷恺 9201 kai3 +愸 4433 zheng3 +愹 9306 yong3 +愺 9404 cao3 +愻 1233 sun4xun4 +愼 9108 shen4 +愽 9304 bo2 +愾忾 9801 kai4 +愿願 7133 yuan4 514 +慀 9208 xie2 +慁 6033 hun4 +慂 3733 yong3 +慃 9802 yang3 +慄栗 9109 li4 +慅 9703 sao1cao3 +慆 9207 tao1 +慇 7733 yin1 +慈 8033 ci2 1785 +慉 9006 xu4 +慊 9803 qian4qie4 +態态 2233 tai4 +慌 9401 huang1 1736 +慍愠 9601 yun4 +慎 9408 shen4 1798 +慏 9708 ming3 +慐 1033 gong +慑懾 9104 she4 3141 +慒 9406 cong2 +慓 9109 piao4 +慔 9408 mo4 +慕 4433 mu4 1594 +慖 9600 guo2 +慗 5833 chi4 +慘惨 9302 can3 +慙 5233 can2 +慚惭 9202 can2 +慛 9201 cui2 +慜 8833 min3 +慝 7133 te4 +慞 9004 zhang1 +慟恸 9402 tong4 +慠 9804 ao4 +慡 9408 shuang3 +慢 9604 man4 slow 734 +慣惯 9708 guan4 +慤悫 4733 que4 +慥 9403 zao4cao4 +慦 4833 jiu4 +慧 5533 hui4 1442 +慨 9101 kai3 2072 +慩 9503 lian2 +慪怄 9101 ou4 +慫怂 2833 song3 +慬 9401 jin3jin4qin2 +慭 4333 yin4 +慮虑 2123 lv4 +慯 9802 shang1 +慰 7433 wei4 1493 +慱 9504 tuan2 +慲 9402 man2 +慳悭 9701 qian1 +慴 9706 she4zhe2 +慵 9002 yong1yong2 +慶庆 0024 qing4 +慷 9009 kang1 2904 +慸 4433 di4 +慹 4533 zhi2zhe2 +慺 9504 lou2 +慻 9906 juan4 +慼 5333 qi1 +慽 9305 qi1 +慾 8733 yu4 +慿 3133 ping2 +憀 9702 liao2 +憁 9603 cong1zong3 +憂忧 1024 you1 +憃 5033 chong1 +憄 2433 zhi4 +憅 2433 tong4 +憆 9901 cheng1zheng4 +憇 2433 qi4 +憈 9101 qu1 +憉 9202 peng2 +憊惫 2433 bei4 +憋 9733 bie1 2971 +憌 8733 chun2 +憍 9202 jiao1 +憎 9806 zeng1 2832 +憏 9709 chi4 +憐怜 9905 lian2 +憑凭 3133 ping2 +憒愦 9508 kui4 +憓 9503 hui4 +憔 9003 qiao2 3425 +憕 9201 cheng2 +憖 4333 yin4 +憗 4833 yin4 +憘 9406 xi3 +憙 4033 xi3 +憚惮 9605 dan4 +憛 9104 tan2 +憜 9402 duo3 +憝 0833 dui4 +憞 9804 dui4 +憟 9109 su4 +憠 7133 jue2 +憡 9809 ce4 +憢 9401 xiao1 +憣 9206 fan2fan1 +憤愤 9408 fen4 +憥 9933 lao2 +憦 9902 lao4 +憧 9001 chong1 3556 +憨 1833 han1 3500 +憩 2433 qi4 3850 +憪 9702 xian2 +憫悯 9702 min3 +憬 9609 jing3 3681 +憭 9409 liao3liao2 +憮怃 9803 wu3 +憯 9106 can3 +憰 9702 jue2 +憱 9301 cu4 +憲宪 3033 xian4 +憳 9704 tan3 +憴 9701 sheng2 +憵 7033 pi1 +憶忆 9003 yi4 +憷 9408 chu3 +憸 9808 xian1 +憹 9503 nao2 +憺 9706 dan4 +憻 9001 tan3 +憼 4833 jing3 +憽 9403 song1 +憾 9303 han4 2296 +憿 9804 jiao1ji1jiao3 +懀 9806 wai4 +懁 9003 huan2xuan1 +懂 9401 dong3 know 1123 +懃 4433 qin2 +懄 9402 qin2 +懅 9103 qu2ju4 +懆 9609 cao3 +懇恳 2733 ken3 +懈 9705 xie4 2596 +應应 0023 ying1ying4 +懊 9708 ao4 3030 +懋 4433 mao4 +懌怿 9604 yi4 +懍懔 9009 lin3 +懎 9406 se4 +懏 9002 jun4 +懐 9403 huai2 +懑懣 3433 men4 +懒懶 9708 lan3 lazy 2078 +懓 9204 ai4 +懔懍 9009 lin3 +懕 7123 yan1 +懖 8233 gua1 +懗 9403 xia4 +懘 3433 chi4 +懙 9708 yu3yu2 +懚 9203 yin4 +懛 9401 dai1 +懜 9402 meng4 +懝 9708 ai4 +懞 9403 meng2 +懟怼 3433 dui4 +懠 9002 qi2 +懡 7003 mo3 +懢 7801 lan2 +懣懑 3433 men4 +懤 9404 chou2 +懥 9408 zhi4 +懦 9102 nuo4 3540 +懧 9302 nuo4 +懨恹 9103 yan1 +懩 9803 yang3 +懪 9603 bo2 +懫 9208 zhi2zhi4 +懬 0023 kuang4 +懭 9008 kuang4 +懮 9104 you3you1 +懯 5833 fu1 +懰 9200 liu2 +懱 9305 mie4 +懲惩 2833 cheng2 +懳 9503 hui4 +懴 9305 chan4 +懵 9406 meng3meng2 +懶懒 9708 lan3 +懷怀 9403 huai2 +懸悬 2233 xuan2 +懹 9003 rang4 +懺忏 9305 chan4 +懻 9408 ji4 +懼惧 9601 ju4 +懽 9401 huan1 +懾慑 9104 she4 +懿 4713 yi4 3728 +戀恋 2233 lian4 +戁 4033 nan3 +戂 9001 mi2 +戃 9903 tang3chang3 +戄 9604 jue2 +戅 0133 gang4zhuang4 +戆戇 0733 gang4zhuang4 +戇戆 0733 gang4zhuang4 +戈 5300 ge1 u 1810 +戉 5370 yue4 +戊 5320 wu4 3971 +戋戔 5300 jian1 +戌 5320 xu1 3651 +戍 5320 shu4 3583 +戎 5340 rong2 3042 +戏戲 7345 xi4hu1 drama play show 853 +成 5320 cheng2 51 +我 2355 wo3 me 16 +戒 5340 jie4 1585 +戓 5360 ge1 +戔戋 5350 jian1 +戕 2325 qiang1qiang2 +或 5310 huo4yu4 or 257 +戗戧 8375 qiang1qiang4 +战戰 2365 zhan4 war 335 +戙 7325 dong4 +戚 5320 qi1 1950 +戛 1050 jia2 +戜 5310 die2 +戝 6385 zei2ze2 +戞 1050 jia2 +戟 4345 ji3 3370 +戠 0365 shi4 +戡 4375 kan1 +戢 6315 ji2 +戣 1385 kui2 +戤 1315 gai4 +戥 6315 deng3 +戦 9355 zhan4 +戧戗 8365 qiang1qiang4 +戨 1365 ge1 +戩戬 1365 jian3 +截 4325 jie2 1439 +戫 4325 yu4 +戬戩 1365 jian3 +戭 3385 yan3yin3 +戮 1325 lu4 3434 +戯戱 2325 xi4hu1 +戰战 6355 zhan4 +戱戯 2325 xi4hu1 +戲戏 2325 xi4hu1 +戳 1325 chuo1 2797 +戴 4385 dai4 1111 +戵 6325 qu2 +戶户 3027 hu4 u +户戶 3020 hu4 626 +戸 3020 hu4 +戹 3021 e4 +戺 7721 shi4 +戻 3028 li4 +戼 1127 mao3 +戽 3024 hu4 +戾 3028 li4lie4 +房 3022 fang2 386 +所 7222 suo3 institute 59 +扁 3022 bian3pian1 2588 +扂 3026 dian4 +扃 3022 jiong1jiong3 +扄 3022 shang3 +扅 3022 yi2 +扆 3023 yi3 +扇 3022 shan4shan1 1622 +扈 3021 hu4 3927 +扉 3021 fei1 3484 +扊 3028 yan3 +手 2050 shou3 u hand 126 +扌 5000 shou3 +才 4020 cai2 176 +扎 5201 zha1zha2za1 1340 +扏 5401 qiu2 +扐 5402 le4 +扑撲 4300 pu1bu1 1337 +扒 5800 ba1pa1pa2 3065 +打 5102 da3da2 fight beat strike 166 +扔 5702 reng1reng4 throw 2097 +払 5203 fu2 +扖 5800 ru4 +扗 5401 zai4 +托 5201 tuo1 735 +扙 5500 zhang4 +扚 5702 diao1 +扛 5101 kang2gang1 2845 +扜 5104 yu1 +扝 5102 ku1wu1 +扞 5104 han4gan3 +扟 5701 shen1 +扠 5704 cha1zha3 +扡 5401 yi3chi3tuo1 +扢 5801 gu3ge1xi4 +扣 5600 kou4 1556 +扤 5101 wu4 +扥 5501 tuo1 +扦 5204 qian1 +执執 5501 zhi2 711 +扨 5704 ren4 +扩擴 5000 kuo4 enlarge 1638 +扪捫 5702 men2 +扫掃 5707 sao3sao4 1174 +扬揚 5702 yang2 757 +扭 5701 niu3 1582 +扮 5802 ban4 1749 +扯 5101 che3 1802 +扰擾 5301 rao3 1475 +扱 5704 xi1cha1 +扲 5802 qian2 +扳 5204 ban1pan1 2826 +扴 5802 jia2 +扵 5803 yu2 +扶 5508 fu2pu2 1217 +扷 5208 ao4 +扸 5202 xi1 +批 5201 pi1 batch 932 +扺 5204 zhi3 +扻 5708 zi4jie2zhi4 +扼 5101 e4 3119 +扽 5501 dun4den4 +找 5305 zhao3 find search 391 +承 1723 cheng2 645 +技 5404 ji4 833 +抁 5301 yan3 +抂 5101 kuang2 +抃 5003 bian4pan4 +抄 5902 chao1 2126 +抅 5702 ju1 +抆 5004 wen4wen3 +抇 5600 hu2gu3 +抈 5702 yue4 +抉 5508 jue2 3714 +把 5701 ba3ba4 112 +抋 5301 qin4 +抌 5401 zhen3shen4 +抍 5400 zheng3 +抎 5103 yun3 +抏 5101 wan2wan4 +抐 5402 nu4 +抑 5702 yi4 1812 +抒 5702 shu1 2869 +抓 5203 zhua1 792 +抔 5109 pou2bao4 +投 5704 tou2 573 +抖 5400 dou3 1651 +抗 5001 kang4 1092 +折 5202 zhe2 1034 +抙 5205 pou2pou1 +抚撫 5101 fu3hu1 1540 +抛拋 5401 pao1 hurl 1843 +抜 5404 ba2 +抝 5702 ao3niu4 +択 5708 ze2 +抟摶 5503 zhuan1 +抠摳 5101 kou1 3680 +抡掄 5801 lun2lun1 3571 +抢搶 5801 qiang3 rob 1144 +抣 5702 yun1 +护護 5300 hu4 535 +报報 5704 bao4 174 +抦 5102 bing3 +抧 5608 zhi3 +抨 5104 peng1 +抩 5505 tan1 +抪 5402 pu1 +披 5404 pi1 1866 +抬 5306 tai2 1200 +抭 5301 yao3 +抮 5802 zhen3 +抯 5701 zha1 +抰 5508 yang3 +抱 5701 bao4 985 +抲 5102 he1 +抳 5701 ni3 +抴 5401 yi4ye4 +抵 5204 di3 1225 +抶 5508 chi4 +抷 5101 pi1 +抸 5203 za1 +抹 5509 mo3mo4ma1 wipe 1861 +抺 5509 mei4 +抻 5500 chen1 +押 5605 ya1xia2 1936 +抽 5506 chou1 pump 1032 +抾 5403 qu1jie2 +抿 5704 min3 3773 +拀 5601 chu4 +拁 5600 jia1 +拂 5502 fu2bi4 2275 +拃 5801 zhan3zha4 +拄 5001 zhu3 3699 +担擔 5601 dan4dan1dan3 756 +拆 5204 chai1 1830 +拇 5705 mu3 3348 +拈 5106 nian1 3142 +拉 5001 la1la2 pull 398 +拊 5400 fu3 +拋抛 5401 pao1 +拌 5905 ban4pan4 3505 +拍 5600 pai1 949 +拎 5803 ling1 3445 +拏 4750 na2 +拐 5602 guai3 2052 +拑 5407 qian2 +拒 5101 ju4ju3 1241 +拓 5106 tuo4ta4zhi2 1967 +拔 5304 ba2bei4 1374 +拕 5301 tuo1 +拖 5801 tuo1 drag 1399 +拗 5402 ao3ao4niu4 3444 +拘 5702 ju1gou1 2077 +拙 5207 zhuo1 2772 +拚 5304 pin1pan4fan1 2657 +招 5706 zhao1 679 +拜 2155 bai4 1165 +拝 5105 bai4 +拞 5201 di3 +拟擬 5800 ni3 1748 +拠 5704 ju4 +拡 5003 kuo4 +拢攏 5301 long3 2485 +拣揀 5509 jian3 pick 2794 +拤 5103 qia3 +拥擁 5702 yong1 1022 +拦攔 5801 lan2 1827 +拧擰 5302 ning2ning3ning4 3034 +拨撥 5304 bo1fa2 1522 +择擇 5705 ze2zhai2 1078 +拪 5106 qian1 +拫 5703 hen2 +括 5206 kuo4gua1 1307 +拭 5304 shi4 3009 +拮 5406 jie2jia2 +拯 5701 zheng3 3060 +拰 5201 nin3 +拱 5408 gong3 2335 +拲 4450 gong3 +拳 9050 quan2 1502 +拴 5801 shuan1 3137 +拵 5404 cun2 +拶 5202 zan3za1 +拷 5402 kao3 2912 +拸 5702 chi3yi2 +拹 5402 xie2 +拺 5409 ce4 +拻 5408 hui1 +拼 5804 pin1 1543 +拽 5500 zhuai4zhuai1 3363 +拾 5806 shi2jie4she4 ten pick 1464 +拿 8050 na2 take 509 +挀 5203 bo4 +持 5404 chi2 371 +挂掛 5401 gua4 1045 +挃 5101 zhi4 +挄 5901 kuo4 +挅 5709 duo3 +挆 5709 duo3 +指 5206 zhi3 253 +挈 5750 qie4qi4 +按 5304 an4 press 617 +挊 5103 nong4 +挋 5101 zhen4 +挌 5706 ge2 +挍 5004 jiao4 +挎 5402 ku1kou1kua4 +挏 5702 dong4 +挐 4650 ru2na2 +挑 5201 tiao1tiao3 1029 +挒 5200 lie4 +挓 5301 zha1 +挔 5003 lv3 +挕 5104 die2 +挖 5301 wa1 dig 1700 +挗 5508 jue2 +挘 5902 lie3 +挙 9050 ju3 +挚摯 5550 zhi4 2779 +挛攣 0050 luan2 3934 +挜掗 5101 ya4 +挝撾 5403 zhua1wo1 3970 +挞撻 5403 ta4 +挟挾 5508 xie2jia1xia2 2677 +挠撓 5501 nao2 2766 +挡擋 5907 dang3dang4 1739 +挢撟 5202 jiao3 +挣掙 5705 zheng1zheng4 1813 +挤擠 5002 ji3 1487 +挥揮 5705 hui1 821 +挦撏 5704 xun2xian2 +挧 5702 yu3 +挨 5308 ai1ai2 1984 +挩捝 5801 tuo1shui4 +挪 5702 nuo2ruo2 2261 +挫 5801 cuo4 2487 +挬 5404 bo2 +挭 5104 geng3 +挮 5802 ti3 +振 5103 zhen4 1177 +挰 5601 cheng2 +挱 5902 suo1 +挲 3950 suo1 +挳 5101 keng1qian1 +挴 5805 mei3 +挵 5104 long4nong4 +挶 5702 ju2 +挷 5702 bang4peng2 +挸 5601 jian3 +挹 5601 yi4 +挺 5204 ting3 1436 +挻 5204 shan1 +挼 5204 nuo4nuo2ruo2 +挽輓 5701 wan3 2054 +挾挟 5408 xie2jia1xia2 +挿 5205 cha1zha3 +捀 5705 feng1 +捁 5406 jiao3 +捂 5106 wu3 3190 +捃 5706 jun4 +捄 5309 jiu4 +捅 5702 tong3 3955 +捆 5600 kun3 bind 2376 +捇 5403 huo4 +捈 5809 tu2 +捉 5608 zhuo1 catch 1597 +捊 5204 pou2 +捋 5204 luo1lv3 +捌 5200 ba1 eight 5000 +捍 5604 han4 3745 +捎 5902 shao1 3541 +捏 5601 nie1 2413 +捐 5602 juan1 2260 +捑 5608 ze2 +捒 5509 song3 +捓 5702 ye2 +捔 5702 jue2 +捕 5302 bu3 1482 +捖 5301 wan2 +捗 5102 bu4 +捘 5304 zun4 +捙 5500 yi4 +捚 5601 zhai1 +捛 5606 lv3 +捜 5504 sou1 +捝挩 5801 tuo1 +捞撈 5402 lao1 2574 +损損 5608 sun3 1189 +捠 5208 bang1 +捡撿 5801 jian3lian4 2711 +换換 5708 huan4 559 +捣搗 5702 dao3 2725 +捤 5701 wei3 +捥 5301 wan4 +捦 5801 qin2 +捧 5505 peng3 1898 +捨舍 5806 she3 +捩 5308 lie4li4 +捪 5206 min2 +捫扪 5702 men2 +捬 5004 fu3 +捭 5604 bai3 +据據 5706 ju4ju1 407 +捯 5202 dao3dao2 +捰 5609 wo3 +捱 5101 ai2 +捲 5901 juan3quan2 +捳 5207 yue4 +捴 5803 zong3 +捵 5508 chen3chen1 +捶 5201 chui2 3421 +捷 5508 jie2qie4 fast 1705 +捸 5509 tu1 +捹 5404 ben4 +捺 5409 na4 3319 +捻 5803 nian3nie1 3398 +捼 5204 nuo2ruo2 +捽 5004 zu2zuo2 +捾 5307 wo4 +捿 5504 xi1 +掀 5708 xian1 2247 +掁 5103 cheng2 +掂 5006 dian1 3924 +掃扫 5702 sao3sao4 +掄抡 5802 lun1lun2 +掅 5502 qing4 +掆㧏 5702 gang1 +掇 5704 duo2duo1 +授 5204 shou4 1132 +掉 5104 diao4 817 +掊 5006 pou3pou2 +掋 5001 di3 +掌 9050 zhang3 732 +掍 5601 gun3hun3 +掎 5402 ji3 +掏 5702 tao1 2246 +掐 5707 qia1 3389 +掑 5408 qi2 +排 5101 pai2pai3bei4 666 +掓 5704 shu2 +掔 7750 qian1 +掕 5404 ling4 +掖 5004 ye4ye1yi4ye3 3591 +掗挜 5101 ya4 +掘 5707 jue2 dig 2013 +掙挣 5205 zheng1zheng4 +掚 5102 liang3 +掛挂 5300 gua4 +掜 5701 yi3ni3nie4 +掝 5305 huo4xu4 +掞 5908 shan4yan4 +掟 5308 zheng3 +掠 5009 lue4lue3 2107 +採采 5209 cai3 +探 5709 tan4tan1 849 +掣 2250 che4 3262 +掤 5702 bing1 +接 5004 jie1 173 +掦 5602 ti4 +控 5301 kong4qiang1 1060 +推 5001 tui1 push 427 +掩 5401 yan3 1448 +措 5406 cuo4ze2 1349 +掫 5704 zou1 +掬 5702 ju2ju1 3741 +掭 5203 tian4 +掮 5302 qian2 +掯 5102 ken4 +掰 2255 bai1 hand +掱 2055 shou3pa2 +掲 5602 jie1qi4 +掳擄 5102 lu3 3832 +掴摑 5600 guo2 +掵 5802 ming4 +掶 5008 jie2 +掷擲 5702 zhi4 2525 +掸撣 5805 dan3shan4 +掹 5701 meng1 +掺摻 5302 chan1xian1can4shan3 mix 3224 +掻 5703 sao1 +掼摜 5708 guan4 +掽 5801 peng4 +掾 5703 yuan4 +掿 5406 nuo4 +揀拣 5509 jian3 +揁 5108 zhen1 +揂 5806 jiu1 +揃 5802 jian1jian3 +揄 5802 yu2you2 +揅 1150 yan2 +揆 5208 kui2 +揇 5402 nan3 +揈 5702 hong1 +揉 5709 rou2 2690 +揊 5106 pi4 +揋 5603 wei1 +揌 5603 sai1 +揍 5508 zou4cou4 3608 +揎 5301 xuan1shuan1 +描 5406 miao2 1427 +提 5608 ti2di1di3 204 +揑 5701 nie1 +插 5207 cha1 1227 +揓 5801 shi4 +揔 5703 zong3zong1 +揕 5401 zhen4 +揖 5604 yi1ji2 3476 +揗 5206 shun3 +揘 5601 heng2 +揙 5302 bian4 +揚扬 5602 yang2 +換换 5708 huan4 +揜 5804 yan3 +揝 5806 zuan4 +揞 5006 an3 +揟 5702 xu1 +揠 5101 ya4 +握 5701 wo4 hold 961 +揢 5706 ke4 +揣 5202 chuai3tuan2zhui1 2878 +揤 5702 ji2 +揥 5002 ti4di4 +揦 5200 la2 +揧 5250 la4 +揨 5002 cheng2 +揩 5206 kai1 3749 +揪 5908 jiu1 2821 +揫 2950 jiu1 +揬 5308 tu2 +揭 5602 jie1 1670 +揮挥 5705 hui1 +揯 5101 geng1 +揰 5201 chong4 +揱 9250 shuo4xiao1 +揲 5409 she2die2ye4 +揳 5708 xie1 +援 5204 yuan2 1720 +揵 5504 qian2jian4 +揶 5702 ye2 +揷 5205 cha1 +揸 5401 zha1 +揹 5202 bei1 +揺 5207 yao2 +揻 5305 wei1 +揼 5109 beng4 +揽攬 5801 lan3 2625 +揾搵 5601 wen4 +揿撳 5708 qin4 +搀攙 5703 chan1 3188 +搁擱 5702 ge1ge2 2283 +搂摟 5904 lou3lou1 2746 +搃 5803 zong3 +搄 5101 geng1 +搅攪 5901 jiao3 2693 +搆 5504 gou4 +搇 5803 qin4 +搈 5306 yong3 +搉 5401 que4 +搊 5702 chou1 +搋 5201 chuai1 +搌 5703 zhan3 +損损 5608 sun3 +搎 5209 sun1 +搏 5304 bo2 2318 +搐 5006 chu4chou1 +搑 5404 rong3 +搒 5002 bang4peng2 +搓 5801 cuo1 3251 +搔 5703 sao1zhao3 3481 +搕 5401 ke4 +搖摇 5207 yao2 +搗捣 5702 dao3 +搘 5406 zhi1 +搙 5104 nu4 +搚 5402 xie2la1 +搛 5803 jian1 +搜 5704 sou1 search 1533 +搝 5608 qiu3 +搞 5002 gao3 fuck 1472 +搟 5104 xian3 +搠 5702 shuo4 +搡 5709 sang3 +搢 5106 jin4 +搣 5305 mie4 +搤 5801 e4 +搥 5703 chui2 +搦 5702 nuo4 +搧 5302 shan1 +搨 5602 ta4da1 +搩 5509 jie2 +搪 5006 tang2 3995 +搫 2750 pan2 +搬 5704 ban1 1547 +搭 5406 da1ta4 1435 +搮 5109 li4 +搯 5207 tao1 +搰 5702 hu2gu3 +搱 5704 zhi4 +搲 5303 wa1 +搳 5306 xia2hua2 +搴 3050 qian1 +搵揾 5601 wen4 +搶抢 5806 qiang3 +搷 5408 tian2shen1 +搸 5509 zhen1 +搹 5102 e4 +携攜 5002 xi1xi2xie2 2024 +搻 8055 nuo4 +搼 5905 quan2 +搽 5409 cha2 +搾 5301 zha4 +搿 2255 ge2 +摀 5702 wu3 +摁 5603 en4 +摂 5108 she4nie4 +摃 5108 kang2gang1 +摄攝 5104 she4nie4 1636 +摅攄 5103 shu1 +摆擺 5603 bai3 980 +摇搖 5207 yao2 shake 927 +摈擯 5308 bin4 +摉 5302 sou1 +摊攤 5001 tan1 2036 +摋 5704 sa4 +摌 5301 chan3 +摍 5306 suo1 +摎 5702 liao2jiu1liu2 +摏 5507 chong1 +摐 5808 chuang1 +摑掴 5600 guo2 +摒 5704 bing4 3846 +摓 5703 feng2 +摔 5004 shuai1 2200 +摕 5402 di4 +摖 5709 qi4 +摗 5708 sou1song3 +摘 5002 zhai1zhe2 pick 1715 +摙 5503 lian3 +摚 5901 tang2 +摛 5002 chi1li2 +摜掼 5508 guan4 +摝 5001 lu4 +摞 5609 luo4luo2 +摟搂 5504 lou3lou1lou2 +摠 5603 zong3zong1 +摡 5101 gai4xi4 +摢 5104 hu4 +摣 5101 zha1za1 +摤 5408 chuang3 +摥 5802 tang4 +摦 5203 hua4 +摧 5201 cui1cuo4 2669 +摨 5705 nai2 +摩 0025 mo2ma1 1348 +摪 5704 jiang1 +摫 5601 gui1 +摬 5001 ying4 +摭 5003 zhi2tuo4 +摮 5850 ao2 +摯挚 4450 zhi4 +摰 4550 nie4 +摱 5604 man2 +摲 5202 shan4zhan4 +摳抠 5101 kou1 +摴 5102 shu1 +摵 5305 suo3she4 +摶抟 5504 tuan2zhuan1 +摷 5209 jiao3 +摸 5408 mo1mo2 1203 +摹 4450 mo2 3295 +摺 5706 zhe2la1 +摻掺 5302 chan1shan3can4xian1 +摼 5701 keng1 +摽 5109 piao4biao1 +摾 5603 jiang4 +摿 5806 yin1 +撀 4750 gou4 +撁 5305 qian1 +撂 5606 liao4 3695 +撃 5750 ji2 +撄攖 5704 ying1 +撅 5108 jue1jue2 +撆 9850 pie1pie3 +撇 5804 pie1pie3 2661 +撈捞 5902 lao1 +撉 0850 dun1 +撊 5702 xian4 +撋 5702 ruan2nuo2 +撌 5508 kui4gui4 +撍 5106 zan3 +撎 5401 yi4 +撏挦 5704 xun2xian2 +撐撑 5905 cheng1 +撑撐 5905 cheng1 1747 +撒 5804 sa1sa3 1856 +撓挠 5401 nao2 +撔 5609 heng4 +撕 5202 si1xi1 2528 +撖 5804 qian3han4 +撗 5408 huang2 +撘 5806 da1 +撙 4804 zun3 +撚 5303 nian3 +撛 5905 lin3 +撜 5201 zheng3cheng2 +撝㧑 4202 hui1 +撞 5001 zhuang4chuang2 1316 +撟挢 5202 jiao3 +撠 5305 ji3 +撡 5303 cao1 +撢 5104 dan3tan4 +撣掸 5605 dan3chan2shan4 +撤 5804 che4 1797 +撥拨 5204 bo1fa2 +撦 5406 che3 +撧 5701 jue2jue1 +撨 5003 xiao1 +撩 5409 liao1liao2 3138 +撪 5305 ben4 +撫抚 5803 fu3hu1 +撬 5201 qiao4 3887 +播 5206 bo1bo4bo3 1479 +撮 5604 cuo1zuo3 3373 +撯 5806 zhuo2 +撰 5708 zhuan4 2591 +撱 5402 tuo3 +撲扑 5208 pu1 +撳揿 5708 qin4 +撴 5806 dun1 +撵攆 5505 nian3 3865 +撶 5405 hua2 +撷擷 5108 xie2 +撸擼 5706 lu3 +撹 5701 jiao3 +撺攛 5305 cuan1 +撻挞 5403 ta4 +撼 5303 han4 2923 +撽 5804 qiao4 +撾挝 5703 zhua1wo1 +撿捡 5808 jian3lian4 +擀 5804 gan3han4 +擁拥 5001 yong1yong3 +擂 5106 lei2lei4lei1 grind 3081 +擃 5503 kuo3 +擄掳 5102 lu3 +擅 5001 shan4 2351 +擆 5406 zhuo2 +擇择 5604 ze2zhai2 +擈 5209 pu1bu3 +擉 5602 chuo4chuo1 +擊击 5750 ji1 +擋挡 5906 dang3dang4 +擌 5808 suo3 +操 5609 cao1cao4 fuck 993 +擎 4850 qing2 2465 +擏 5804 jing4qing2 +擐 5603 huan4 +擑 5305 jie1 +擒 5802 qin2 2742 +擓㧟 5101 kuai3 +擔担 5706 dan1dan4 +擕 5002 xi1xi2xie2 +擖 5402 ge3ye4 +擗 5004 pi4pi3 +擘 7050 bo4 +擙 5708 ao4 +據据 5103 ju4 +擛 5409 ye4 +擜 5308 e4 +擝 5701 meng1 +擞擻 5804 sou3sou4 +擟 5102 mi2 +擠挤 5002 ji3 +擡 5401 tai2 +擢 5701 zhuo2 +擣 5404 dao3 +擤 5604 xing3 +擥 7850 lan3 +擦 5309 ca1 wipe 1726 +擧 7750 ju3 +擨 5708 ye2 +擩 5102 ru3rui4 +擪 7125 ye4 +擫 5108 ye4 +擬拟 5708 ni3 +擭 5404 wo4huo4hu4 +擮 5305 ji2 +擯摈 5308 bin4 +擰拧 5302 ning2ning3ning4 +擱搁 5702 ge1ge2 +擲掷 5702 zhi4zhi2zhi1 +擳 5802 jie2 +擴扩 5008 kuo4 +擵 5005 mo2mi2ma1 +擶 5802 jian4 +擷撷 5108 xie2 +擸 5201 lie4la4 +擹 5708 tan1 +擺摆 5601 bai3 +擻擞 5804 sou3sou4 +擼撸 5706 lu3 +擽㧰 5209 lue4li4luo4 +擾扰 5104 rao3rou2 +擿 5003 zhi2ti4zhi4 +攀 4450 pan1 2057 +攁 5803 yang3 +攂 5606 lei4lei2 +攃 5409 sa4 +攄摅 5103 shu1 +攅 5408 zan3 +攆撵 5505 nian3 +攇 5303 xian3 +攈 5009 jun4 +攉 5101 huo4huo1que4 +攊 5101 li4 +攋 5708 la4 +攌 5600 han4huan3 +攍 5001 ying2 +攎 5101 lu2 +攏拢 5101 long3 +攐 5303 qian1 +攑 5705 qian1 +攒攢 5408 zan3 2961 +攓 5308 qian1 +攔拦 5702 lan2 +攕 5305 san1xian1 +攖撄 5604 ying1 +攗 5009 mei2 +攘 5003 rang3 3349 +攙搀 5701 chan1 +攚 5906 weng3 +攛撺 5301 cuan1 +攜携 5202 xie2xi1xi2 +攝摄 5104 she4nie4 +攞 5601 luo3luo1lv3 +攟 5006 jun4 +攠 5001 mi2ma1mo2 +攡 5001 li2chi1 +攢攒 5408 zan3cuan2zuan1 +攣挛 2250 luan2 +攤摊 5001 tan1 +攥 5809 zuan4 +攦 5101 li4xi3 +攧 5108 dian1die2 +攨 5303 wa1 +攩 5903 dang3tang3 +攪搅 5701 jiao3 +攫 5604 jue2 3607 +攬揽 5801 lan3 +攭 5703 li4 +攮 5003 nang3 +支 4040 zhi1 u 497 +攰 4440 gui4 +攱 0414 gui3 +攲 4464 qi1ji1yi1 +攳 4740 xin2 +攴 2140 pu1po1 u +攵 8040 sui1 +收 2874 shou1 306 +攷 1824 kao3kao2 +攸 2824 you1 3692 +改 1874 gai3 352 +攺 7874 yi3 +攻 1814 gong1 973 +攼 1844 gan1 +攽 8824 ban1bin1 +放 0824 fang4fang3 set 183 +政 1814 zheng4zheng1 492 +敀 2864 bo2 +敁 2164 dian1 +敂 2864 kou4 +敃 7874 min3 +敄 1824 wu4mou4 +故 4864 gu4gu3 385 +敆 8164 he2 +敇 5894 ce4 +效 0844 xiao4 776 +敉 9894 mi3 +敊 2194 chu4 +敋 2864 ge2guo2 +敌敵 2864 di2 1028 +敍 8194 xu4 +敎 4844 jiao4jiao1 +敏 8874 min3 1320 +敐 7824 chen2 +救 4894 jiu4 save 800 +敒 2824 zhen4 +敓 8824 duo2 +敔 1864 yu3 +敕 5894 chi4 +敖 4824 ao2ao4 3010 +敗败 6884 bai4 +敘叙 8894 xu4 +教 4844 jiao4jiao1 teach 211 +敚 8824 duo2 +敛斂 8814 lian4lian3 2384 +敜 8834 nie4 +敝 9824 bi4 3155 +敞 9824 chang3 2426 +敟 5884 dian3 +敠 7144 duo2 +敡 6124 yi4 +敢 1814 gan3 dare 723 +散 4824 san4san3 696 +敤 6194 ke3 +敥 9286 yan4 +敦 0844 dun1dui4 1870 +敧 4164 qi3 +敨 0864 dou3 +敩 9844 xiao4 +敪 7844 duo2 +敫 2824 jiao4jiao3 +敬 4864 jing4 1057 +敭 6824 yang2 +敮 2174 xia2gui1 +敯 7164 min2hun1 +数數 9844 shu4shu3shuo4 digit 218 +敱 2114 ai2zhu2 +敲 0124 qiao1 knock 1657 +敳 2814 ai2 +整 5810 zheng3 402 +敵敌 0824 di2 +敶 7824 zhen4 +敷 5824 fu1 2593 +數数 5844 shu4shu3shuo4 +敹 2894 liao2 +敺 7174 qu1 +敻 2740 xiong4 +敼 4164 xi3 +敽 2124 jiao3 +敾 8864 shan4 +敿 2824 jiao3 +斀 6114 zhuo2 +斁 6844 yi4du4 +斂敛 8884 lian3 +斃毙 9821 bi4 +斄 4729 li4 +斅 7144 xiao4 +斆敩 7844 xiao4 +文 0040 wen2 u 97 +斈 0040 xue2 +斉 0022 qi2 +斊 0040 qi2 +斋齋 0022 zhai1 2355 +斌 0344 bin1 2493 +斍 0021 jue2 +斎 0022 zhai1 +斏 0343 lang2 +斐 1140 fei3fei1 2747 +斑 1111 ban1 2245 +斒 0242 ban1 +斓斕 0742 lan2 +斔 0718 yu3 +斕斓 0742 lan2 +斖 0010 wei3 +斗鬥 3400 dou3 u fight 775 +斘 2420 sheng1 +料 9490 liao4 580 +斚 2240 jia3 +斛 2420 hu2 +斜 8490 xie2 1489 +斝 6640 jia3 +斞 7440 yu3 +斟 4470 zhen1 2787 +斠 5450 jiao4 +斡 4844 wo4 +斢 4480 tou3 +斣 6410 chu4 +斤 7222 jin1 u 1774 +斥 7224 chi4 2018 +斦 7222 yin2 +斧 8022 fu3 axe 2603 +斨 2222 qiang1 +斩斬 4252 zhan3 2402 +斪 2262 qu2 +斫 1262 zhuo2 +斬斩 5202 zhan3 +断斷 2272 duan4 394 +斮 4262 zhuo2 +斯 4282 si1 504 +新 0292 xin1 new 162 +斱 4262 zhuo2 +斲 7212 zhuo2 +斳 4212 qin2 +斴 9222 lin2 +斵 7212 zhuo2 +斶 7622 chu4 +斷断 2272 duan4 +斸 7222 zhu3zhu2 +方 0022 fang1 u 48 +斺 0822 xie4 +斻 0821 hang2 +於于 0823 yu2yu1wu1 2851 +施 0821 shi1 594 +斾 0822 pei4 +斿 0824 you2liu2 +旀 0329 mei4 +旁 0022 pang2bang4 843 +旂 0822 qi2 +旃 0824 zhan1 +旄 0821 mao2 +旅 0823 lv3 1131 +旆 0822 pei4 +旇 0824 pi1 +旈 0021 liu2 +旉 5322 fu1 +旊 0821 fang3 +旋 0828 xuan2xuan4 1357 +旌 0821 jing1 3717 +旍 0823 jing1 +旎 0821 ni3 +族 0828 zu2 cluster 749 +旐 0821 zhao4 +旑 0422 yi3 +旒 0821 liu2 +旓 0822 shao1 +旔 0524 jian4 +旕 0861 eos +旖 0822 yi3 +旗 0828 qi2 1365 +旘 0325 zhi4 +旙 0226 fan1 +旚 0829 piao1 +旛 0826 fan1 +旜 0821 zhan1 +旝 0826 guai4kuai4 +旞 0723 sui4 +旟 0828 yu2 +无無 1041 wu2 u 94 +旡 1041 ji4 +既 7171 ji4 525 +旣 2171 ji4 +旤 7121 huo4 +日 6010 ri4 u sun day fuck 100 +旦 6010 dan4 1278 +旧舊 2600 jiu4 old 798 +旨 2260 zhi3 1695 +早 6040 zao3 early 383 +旪 6400 xie2 +旫 6702 tiao1 +旬 2762 xun2 2316 +旭 4601 xu4 2337 +旮 4760 xu4ga1 +旯 6041 xu4la2 +旰 6104 gan4han4 +旱 6040 han4 2461 +旲 6080 tai2 +旳 6702 di4 +旴 6104 xu1 +旵 6077 chan3 +时時 6400 shi2 hour 21 +旷曠 6000 kuang4 2553 +旸暘 6702 yang2 +旹 2260 shi2 +旺 6101 wang4 1989 +旻 6040 min2 +旼 6004 min2 +旽 6501 tun1 +旾 5060 chun1chun3 +旿 6804 wu3 +昀 6702 yun2 +昁 6002 bei4 +昂 6012 ang2 1710 +昃 6028 ze4 +昄 6204 ban3 +昅 6704 jie2 +昆 6071 kun1hun4 1832 +昇 6044 sheng1 +昈 6300 hu4 +昉 6002 fang3 +昊 6080 hao4 3179 +昋 2060 gui4 +昌 6060 chang1 1610 +昍 6600 xuan1 +明 6702 ming2 99 +昏 7260 hun1min3 1562 +昐 6802 fen1 +昑 6802 qin3 +昒 6702 hu1 +易 6022 yi4 415 +昔 4460 xi1cuo4xi2 1875 +昕 6202 xin1 3677 +昖 6803 yan2 +昗 6080 ze4 +昘 6022 fang3 +昙曇 6073 tan2 3999 +昚 4060 shen4 +昛 6101 ju4 +昜 6022 yang2 +昝 2860 zan3can3 +昞 6102 bing3 +星 6010 xing1 star 541 +映 6508 ying4 1127 +昡 6003 xuan4 +昢 6207 pei3pei4 +昣 6802 zhen3 +昤 6803 ling1 +春 5060 chun1 spring 600 +昦 6022 hao4 +昧 6509 mei4 2542 +昨 6801 zuo2 1209 +昩 6509 mo4 +昪 6044 bian4 +昫 6702 xu3xu1xu4 +昬 7760 hun1min3 +昭 6706 zhao1 1713 +昮 6012 zong4 +是 6080 shi4 is are 3 +昰 6010 shi4xia4 +昱 6010 yu4yi4 +昲 6502 fei4 +昳 6508 die2yi4 +昴 6072 mao3 +昵 6701 ni4ni3zhi4 3813 +昶 3690 chang3chang4 +昷 6010 wen1yun4 +昸 6703 dong1 +昹 6309 ai3 +昺 6022 bing3 +昻 6012 ang2 +昼晝 7710 zhou4 daytime 2565 +昽曨 6301 long2 +显顯 6010 xian3 474 +昿 6003 kuang4 +晀 6201 tiao3 +晁 6011 chao2 3821 +時时 6404 shi2 +晃 6021 huang3huang4 1954 +晄 6901 huang3 +晅 6101 xuan1xian3 +晆 6401 kui2 +晇 6402 xu1kua1 +晈 6004 jiao3 +晉晋 1060 jin4 +晊 6101 zhi3 +晋晉 1060 jin4 1879 +晌 6702 shang3 2327 +晍 6702 tong2 +晎 6408 hong3 +晏 6040 yan4 2894 +晐 6008 gai1 +晑 6022 xiang3 +晒曬 6106 shai4 2667 +晓曉 6501 xiao3 855 +晔曄 6404 ye1ye4 +晕暈 6050 yun1yun4 2181 +晖暉 6705 hui1 2731 +晗 6806 han2 +晘 6604 han4 +晙 6304 jun4 +晚 6701 wan3 late 530 +晛 6601 xian4 +晜 6022 kun1 +晝昼 5010 zhou4 +晞 6402 xi1 +晟 6025 sheng4cheng2 3921 +晠 6305 sheng2 +晡 6302 bu1 +晢 5260 zhe2 +晣 6202 zhe2 +晤 6106 wu4 2583 +晥 6301 han4 +晦 6805 hui4 3192 +晧 6406 hao4 +晨 6023 chen2 morning 1408 +晩 6701 wan3 +晪 6508 tian3 +晫 6104 zhuo2 +晬 6004 zui4 +晭 6702 zhou3 +普 8060 pu3 906 +景 6090 jing3ying3 633 +晰 6202 xi1 2208 +晱 6908 shan3 +晲 6701 yi3ni4 +晳 4260 xi4xi1 +晴 6502 qing2 1862 +晵 3460 qi3 +晶 6066 jing1 1818 +晷 6060 gui3 +晸 6014 zhen3zheng3 +晹 6602 yi4 +智 8660 zhi4zhi1 888 +晻 6401 an3yan3 +晼 6301 wan3 +晽 6409 lin2 +晾 6009 liang4 3848 +晿 6606 chang1 +暀 6001 wang3wang4 +暁 6401 xiao3 +暂暫 4260 zan4 1327 +暃 6011 fei1 +暄 6301 xuan1 3730 +暅 6101 xuan3 +暆 6801 yi2 +暇 6704 xia2xia4 2536 +暈晕 6050 yun1yun4 +暉晖 6705 hui1 +暊 6108 fu3 +暋 7860 min3min2 +暌 6208 kui2 +暍 6602 he4ye1 +暎 6408 ying4 +暏 6406 du3 +暐 6405 wei3 +暑 6060 shu3 2511 +暒 6601 qing2 +暓 1860 mao4 +暔 6402 nan2 +暕 6509 jian3lan2 +暖 6204 nuan3 warm 1592 +暗 6006 an4 828 +暘旸 6602 yang2 +暙 6506 chun1 +暚 6207 yao2 +暛 6801 suo3 +暜 0060 jin4 +暝 6708 ming2ming3 +暞 6609 jiao3 +暟 6201 kai3 +暠 6022 gao3hao4 +暡 6802 weng3 +暢畅 5602 chang4 +暣 6801 qi4 +暤 6604 hao4 +暥 6604 yan4 +暦 7126 li4 +暧曖 6204 ai4 3845 +暨 7110 ji4 3553 +暩 8709 gui4 +暪 6402 men3 +暫暂 5260 zan4 +暬 4560 xie4 +暭 6604 hao4 +暮 4460 mu4 eve 2302 +暯 6408 mo4 +暰 6808 cong1 +暱 6101 ni4 +暲 6004 zhang1 +暳 6507 hui4 +暴 6090 bao4pu4 1134 +暵 6408 han4 +暶 6808 xuan2 +暷 6504 chuan2 +暸 6409 liao2liao3 +暹 3630 xian1 +暺 6604 dan4 +暻 6609 jing3 +暼 9860 pie1 +暽 6905 lin2 +暾 6804 tun1 +暿 6406 xi3 +曀 6401 yi4 +曁 2110 ji4 +曂 6408 huang4 +曃 6503 tai4dai4 +曄晔 6405 ye4 +曅 6050 ye4 +曆历 7126 li4 calendar +曇昙 6073 tan2 +曈 6001 tong2 +曉晓 6401 xiao3 +曊 6508 fei4 +曋 6104 qin3 +曌 6710 zhao4 +曍 6604 hao4 +曎 6604 yi4 +曏向 6022 xiang4 +曐 6010 xing1 +曑 6020 sen1 +曒 6804 jiao3 +曓 6040 bao4 +曔 6804 jing4 +曕 6706 yan4 +曖暧 6204 ai4 +曗 6209 ye4 +曘 6102 ru2 +曙 6606 shu3 2728 +曚 6403 meng2 +曛 6203 xun1 +曜 6701 yao4 3989 +曝 6609 pu4 3416 +曞 6102 li4 +曟 6023 chen2 +曠旷 6008 kuang4 +曡 6010 die2 +曢 6309 u1 +曣 6403 yan4 +曤 6101 huo4 +曥 6101 lu2 +曦 6805 xi1 3289 +曧 6023 rong2 +曨昽 6101 long2 +曩 6073 nang3 +曪 6601 luo3 +曫 2260 luan2 +曬晒 6101 shai4 +曭 6903 tang3 +曮 6604 yan3 +曯 6702 chu2 +曰 6010 yue1 u 1683 +曱 6040 yue1 +曲 5560 qu1qu3 790 +曳 5000 ye4yi4 3149 +更 1050 geng4geng1 195 +曵 5300 ye4 +曶 2760 hu1 +曷 6072 he2 +書书 5060 shu1 +曹 5560 cao2 1593 +曺 5060 cao2 +曻 6025 sheng1 +曼 6040 man4man2 1510 +曽 8060 ceng1 +曾 8060 ceng2zeng1 462 +替 5560 ti4 871 +最 6014 zui4 most 169 +朁 1160 can3 +朂 6042 xu4 +會会 8060 hui4kuai4 +朄 5509 yin4yin3 +朅 4672 qie4 +朆 8762 fen1 +朇 8664 pi2 +月 7722 yue4 u moon month 159 +有 4022 you3 have has 2 +朊 7121 ruan3 +朋 7722 peng2 799 +朌 7822 ban1fen2 +服 7724 fu2fu4 232 +朎 7823 ling2 +朏 7227 fei3pei4 +朐 7722 qu2 +朑 7421 ti4 +朒 7422 nv4 +朓 7221 tiao4tiao3 +朔 8742 shuo4 2812 +朕 7828 zhen4 3670 +朖 7323 lang3 +朗 3772 lang3 1266 +朘 7324 juan1 +朙 6702 ming2 +朚 0062 huang1 +望 0710 wang4 270 +朜 7024 tun1 +朝 4742 zhao1chao2 morning 546 +朞 4422 ji1qi2 +期 4782 qi1ji1 328 +朠 7428 ying1 +朡 7224 zong1 +朢 7710 wang4 +朣 7021 tong2 +朤 7722 lang3 moon +朥 7922 lao2 +朦 7423 meng2 2959 +朧胧 7121 long2long3 +木 4090 mu4 u wood 539 +朩 4090 deng3 +未 5090 wei4 304 +末 5090 mo4 1249 +本 5023 ben3 72 +札 4291 zha2 3073 +朮 4321 shu4zhu2 +术術 4390 shu4zhu2 403 +朰 4071 teul +朱 2590 zhu1shu2 red 841 +朲 4890 ren2 +朳 4890 ba1 +朴樸 4390 po4po1piao2 2005 +朵 7790 duo3 1604 +朶 7790 duo3 +朷 4792 dao1 +朸 4492 li4le4 +朹 4491 qiu2gui3 +机機 4791 ji1 machine 165 +朻 4290 jiu1 +朼 4291 bi3 +朽 4192 xiu3 2552 +朾 4192 cheng2 +朿 5090 ci4 +杀殺 4090 sha1 kill 677 +杁 4890 ru4 +杂雜 4090 za2 785 +权權 4794 quan2 540 +杄 4294 qian1 +杅 4194 yu2 +杆桿 4194 gan1gan3 stem 2062 +杇 4192 wu1 +杈 4794 cha1cha4 +杉 4292 shan1sha1 3023 +杊 4290 xun2 +杋 4791 fan1 +杌 4191 wu4 +杍 4794 zi3 +李 4040 li3 360 +杏 4060 xing4 apricot 2339 +材 4490 cai2 984 +村 4490 cun1 725 +杒 4792 ren4 +杓 4792 shao2biao1 +杔 4291 tuo1 +杕 4498 di4duo4 +杖 4590 zhang4 2453 +杗 0090 mang2 +杘 7729 chi4 +杙 4394 yi4 +杚 4891 gu3 +杛 4792 gong1 +杜 4491 du4 1086 +杝 4491 yi2chi3li2 +杞 4791 qi3 3899 +束 5090 shu4 bunch 900 +杠 4191 gang4gang1 2965 +条條 2790 tiao2 262 +杢 4010 jie2 +杣 4297 mian2 +杤 4192 wan4 +来來 5090 lai2 come 15 +杦 4798 jiu3 +杧 4091 mang2 +杨楊 4792 yang2 811 +杩榪 4792 ma4ma3 +杪 4992 miao3 +杫 4191 si4 +杬 4191 yuan2wan2 +杭 4091 hang2 2002 +杮 4092 fei4bei4 +杯 4199 bei1 cup 1058 +杰傑 4033 jie2 1121 +東东 5090 dong1 +杲 6090 gao3 +杳 4060 yao3 3803 +杴锨 4798 xian1 +杵 4894 chu3 +杶 4591 chun1qun1 +杷 4791 pa2ba4 +杸 4794 shu1 +杹 4491 hua4 +杺 4390 xin1 +杻 4791 chou3niu3 +杼 4792 zhu4shu4 +杽 4295 chou3 +松鬆 4893 song1 loose 765 +板闆 4294 ban3 plate 695 +枀 8090 song1 +极极 4794 ji2 pole 349 +枂 4792 yue4 +枃 4792 jin4 +构構 4792 gou1gou4 1084 +枅 4194 ji1jian1 +枆 4291 mao2 +枇 4291 pi2 +枈 2290 bi4 +枉 4191 wang3 2416 +枊 4792 ang4 +枋 4092 fang1bing4 +枌 4892 fen2 +枍 4892 yi4 +枎 4598 fu2fu1 +枏 4795 nan2 +析 4292 xi1 1459 +枑 4191 hu4 +枒 4194 ya2ya1 +枓 4490 dou3zhu3 +枔 4892 xun2 +枕 4491 zhen3 2324 +枖 4298 yao1 +林 4499 lin2 330 +枘 4492 rui4 +枙 4191 e3e4e2 +枚 4894 mei2 2079 +枛 4293 zhao4 +果 6090 guo3 168 +枝 4494 zhi1qi2 1272 +枞樅 4890 cong1zong1 +枟 4193 yun4yun2 +枠 4494 hua4 +枡 4490 dou3 +枢樞 4191 shu1 2801 +枣棗 5030 zao3 2788 +枤 4398 duo4 +枥櫪 4192 li4 +枦 4390 lu2 +枧梘 4791 jian4jian3 +枨棖 4293 cheng2 +枩 4073 song1 +枪槍 4891 qiang1cheng1 gun 1182 +枫楓 4791 feng1 maple 2479 +枬 4794 nan2 +枭梟 2790 xiao1 3732 +枮 4196 xian1 +枯 4496 ku1 2098 +枰 4194 ping2 +枱 4396 si4tai2 +枲 2390 xi3 +枳 4698 zhi3 +枴 4692 guai3 +枵 4692 xiao1 +架 4690 jia4 881 +枷 4690 jia1 3660 +枸 4792 ju3gou3 +枹 4791 bao1fu2 +枺 4599 mo4 +枻 4491 yi4 +枼 4490 ye4 +枽 4090 ye4 +枾 4592 shi4 +枿 4494 nie4 +柀 4494 bi3 +柁 4391 duo4tuo2 +柂 4891 yi2duo4 +柃 4892 ling2 +柄 4192 bing3bing4 stalk handle 2294 +柅 4791 ni3 +柆 4091 la1 +柇 4299 he2 +柈 4995 pan2 +柉 4293 fan2 +柊 4793 zhong1 +柋 2390 dai4 +柌 4792 ci2 +柍 4598 yang1 +柎 4490 fu1fu3fu4 +柏 4690 bai3bo2bo4 1613 +某 4490 mou3 689 +柑 4497 gan1qian2 3910 +柒 3490 qi1 seven 3490 +染 3490 ran3 1330 +柔 1790 rou2 1169 +柕 4792 mao4 +柖 4796 zhao1 +柗 4896 song1 +柘 4196 zhe4 +柙 4695 xia2 +柚 4596 you4you2 +柛 4590 shen1 +柜櫃 4191 gui4ju3 chest 1667 +柝 4294 tuo4 +柞 4891 zuo4zha4 +柟 4595 nan2 +柠檸 4392 ning2 lemon +柡 4199 yong3 +柢 4294 di3 +柣 4598 die2zhi4 +柤 4791 zha1ju1zu3 +查 4010 cha2zha1 502 +柦 4691 dan4 +柧 4293 gu1 +柨 4492 bu4pu1 +柩 4191 jiu4 +柪 4492 ao1 +柫 4592 fu2 +柬 5090 jian3 2957 +柭 4394 bo1 +柮 4297 duo4 +柯 4192 ke1 2102 +柰 4090 nai4 +柱 4091 zhu4 1599 +柲 4390 bi4 +柳 4792 liu3 1125 +柴 2290 chai2 wood 1912 +柵栅 4794 shan1 fense +柶 4690 si4 +柷 4691 zhu4 +柸 4191 pei1 +柹 9592 shi4 +柺 4692 guai3 +査 4010 cha2zha1 +柼 4398 yao3 +柽檉 4791 jue2cheng1 +柾 4191 jiu4 +柿 4592 shi4 3314 +栀梔 4291 zhi1 +栁 4792 liu3 +栂 4795 mei2 +栃 4292 li4 +栄 9090 rong2 +栅柵 4794 zha4ce4sha4shan1 2929 +栆 5030 zao3 +标標 4199 biao1 678 +栈棧 4395 zhan4 2490 +栉櫛 4492 jie2zhi4 +栊櫳 4391 long2 +栋棟 4499 dong4 2386 +栌櫨 4190 lu2 +栍 4591 saeng +栎櫟 4299 li4lao2yue4 +栏欄 4891 lan2lian4 fence 1666 +栐 4399 yong3 +树樹 4490 shu4 tree 508 +栒 4792 xun2sun3 +栓 4891 shuan1 3488 +栔 5790 qi4 +栕 4191 zhen1 +栖棲 4196 qi1 2760 +栗慄 1090 li4 2454 +栘 4792 yi3yi2 +栙 4795 xiang2 +栚 4898 zhen4 +栛 4492 li4 +栜 4599 su4she4 +栝 4296 gua1tian3 +栞 1190 kan1 +栟 4894 bing1ben1 +栠 2290 ren3 +校 4094 xiao4jiao4 807 +栢 4196 bo2bo4bai3 +栣 4291 ren3 +栤 4299 bing4 +栥 3790 zi1 +栦 4290 chou2 +栧 4590 yi4 +栨 4798 jie2 +栩 4792 xu3 3303 +株 4599 zhu1 2282 +栫 4494 jian4 +栬 4701 zui4 +栭 4192 er2 +栮 4194 er3 +栯 4492 you3yu4 +栰 4395 fa2 +栱 4498 gong3 +栲 4492 kao3 +栳 4491 lao3 +栴 4894 zhan1 +栵 4290 li4 +栶 4690 yin1 +样樣 4895 yang4xiang4 122 +核 4098 he2hu2 1566 +根 4793 gen1 root 369 +栺 4296 zhi3 +栻 4394 shi4chi4 +格 4796 ge2ge1 396 +栽 4395 zai1zai4 2226 +栾欒 0090 luan2 +栿 4398 fu2 +桀 2590 jie2 3857 +桁 4192 heng2hang2hang4 +桂 4491 gui4 1727 +桃 4291 tao2 peach 1706 +桄 4991 guang4guang1 +桅 4791 wei2 mast 3896 +框 4191 kuang4kuang1 2303 +桇 4690 ru2 +案 3090 an4 569 +桉 4394 an1an4 +桊 9090 juan4 +桋 4598 yi2 +桌 2190 zhuo1 table 1038 +桍 4492 ku1 +桎 4191 zhi4zhi2 +桏 4792 qiong2 +桐 4792 tong2 2468 +桑 7790 sang1 1567 +桒 4090 sang1 +桓 4191 huan2 2515 +桔 4496 jie2ju2xie2 3126 +桕 4797 jiu4gao1 +桖 4791 xue4 +桗 4799 duo4duo3 +桘 4797 zhui2 +桙 4395 yu2mou2 +桚 4292 zan3 +桛 4193 kasei +桜 4994 ying1 +桝 4590 jie2 +桞 4792 liu3 +桟 4395 zhan4 +桠椏 4191 ya2 +桡橈 4591 nao2rao2 +桢楨 4198 zhen1zheng1 3639 +档檔 4997 dang3dang4 1924 +桤榿 4291 qi1 +桥橋 4292 qiao2 bridge 1128 +桦樺 4494 hua4 3748 +桧檜 4896 kuai4gui4hui4 +桨槳 3790 jiang3 oak paddle 3560 +桩樁 4091 zhuang1 2317 +桪 4794 xun2xin2 +桫 4992 suo1 +桬 3990 sha1 +桭 4193 zhen1chen2 +桮 4196 bei1 +桯 4691 ting1xing2 +桰 4296 gua1 +桱 4191 jing4 +桲 4494 bo2po5 +桳 4394 ben4 +桴 4294 fu2 +桵 4294 rui3 +桶 4792 tong3 bucket barrel 2119 +桷 4792 jue2 +桸 4492 xi1 +桹 4393 lang2 +桺 4197 liu3 +桻 4795 feng1 +桼 4090 qi1 +桽 4010 wen3 +桾 4796 jun1 +桿杆 4694 gan3 +梀 4599 cu4 +梁 3390 liang2 1180 +梂 4399 qiu2 +梃 4294 ting3ting4 +梄 4196 you3 +梅 4895 mei2 905 +梆 4792 bang1 3943 +梇 4194 long4 +梈 4092 peng1 +梉 4491 zhuang1 +梊 5290 di4 +梋 4692 xuan1 +梌 4899 tu2 +梍 4691 zao4 +梎 4691 ao1you4 +梏 4496 gu4jue2 +梐 4291 bi4 +梑 4998 di2 +梒 4896 han2 +梓 4094 zi3 3573 +梔栀 4291 zhi1 +梕 4793 ren4 +梖 4698 bei4 +梗 4194 geng3 2898 +梘枧 4691 jian4jian3 +梙 4590 huan4 +梚 4791 wan3 +梛 4792 nuo2 +梜 4498 jia2jia1 +條条 2829 tiao2 +梞 4793 ji4 +梟枭 2790 xiao1 +梠 4696 lv3 +梡 4391 hun2kuan3 +梢 4992 shao1sao4 2873 +梣 4292 chen2 +梤 4292 fen2 +梥 3090 song1 +梦夢 4420 meng4 dream 840 +梧 4196 wu2wu4yu3 2810 +梨 2290 li2 2608 +梩 4691 li2si4 +梪 4191 dou4 +梫 4794 cen1qin1 +梬 4592 ying3cheng3 +梭 4394 suo1xun4 2855 +梮 4792 ju2 +梯 4892 ti1ti2 1728 +械 4395 xie4jie4 1993 +梱 4690 kun3 +梲棁 4891 zhuo2 +梳 4091 shu1 comb 2331 +梴 4294 chan1 +梵 4421 fan4 3293 +梶 4791 wei3 +梷 2790 jing4 +梸 4290 li2 +梹 4298 bing1bin1 +梺 4423 xia4 +梻 4592 fo2 +梼檮 4494 tao2dao3 +梽 4493 zhi4 +梾棶 4599 lai2 +梿槤 4493 lian2 +检檢 4891 jian3 970 +棁梲 4891 zhuo2tuo1 +棂欞 4798 ling2 +棃 2790 li2 +棄弃 0090 qi4 +棅 4299 bing4 +棆 4892 zhun1lun2 +棇 4893 cong1 +棈 4592 qian4 +棉 4692 mian2 1911 +棊 4490 qi2 +棋 4498 qi2ji1 1569 +棌 4299 cai3 +棍 4691 gun4hun4 2372 +棎 4799 chan2 +棏 4694 te4 +棐 1190 fei3 +棑 4191 pai2bai4 +棒 4595 bang4 1928 +棓 4096 pou3bang4bei4 +棔 4296 hun1 +棕 4399 zong1 3108 +棖枨 5193 cheng2 +棗枣 5090 zao3 +棘 5599 ji2 2831 +棙 4398 li4 +棚 4792 peng2 2373 +棛 4392 yu4 +棜 4893 yu4 +棝 4690 gu4 +棞 4690 hun2 +棟栋 4599 dong4 +棠 9090 tang2 2616 +棡㭎 4792 gang1 +棢 4792 wang3 +棣 4599 di4ti4dai4 3528 +棤 4496 xi2 +棥 4499 fan2 +棦 4795 cheng1 +棧栈 4395 zhan4 +棨 7890 qi3 +棩 4290 yuan1 +棪 4998 yan3 +棫 4395 yu4 +棬 4992 quan1quan4 +棭 4094 yi4 +森 4099 sen1 1252 +棯 4893 ren3nian4 +棰 4291 chui2duo3 +棱 4494 leng2leng1ling2 3052 +棲栖 4594 qi1xi1 +棳 4794 zhuo2 +棴 4794 fu2 +棵 4699 ke1 2055 +棶梾 4499 lai2 +棷 4794 zou1 +棸 1790 zou1 +棹 4194 zhuo1zhao4 +棺 4397 guan1guan4 2242 +棻 4490 fen2 +棼 4422 fen2 +棽 4420 chen1shen1 +棾 4422 qiong2 +棿 4791 nie4 +椀 4391 wan3 +椁槨 4094 guo3 +椂 4799 lu4 +椃 4191 hao2 +椄 4094 jie1 +椅 4492 yi3yi1 1591 +椆 4792 chou2 +椇 4698 ju3 +椈 4792 ju2 +椉 0090 cheng2sheng4 +椊 4094 zuo2 +椋 4099 liang2 +椌 4391 qiang1 +植 4491 zhi2 1614 +椎 4091 zhui1chui2 3297 +椏桠 4191 ya1ya2 +椐 4796 ju1 +椑 4694 bei1pi2pi4 +椒 4794 jiao1 3069 +椓 4192 zhuo2 +椔 4296 zi1zi4 +椕 4499 bin1 +椖 4392 peng2 +椗 4398 ding4 +椘 4430 chu3 +椙 4696 chang1 +椚 4792 men1 +椛 4491 hua1 +検 4898 jian3 +椝 5790 gui1 +椞 4290 xi4 +椟櫝 4498 du2 +椠槧 5290 qian4 +椡 4290 dao4 +椢 4690 gui4 +椣 4598 dian3 +椤欏 4692 luo2 +椥 4690 zhi1 +椦 4992 quan1juan4quan2 +椧 4892 myeong +椨 4094 fu3 +椩 4098 geng1 +椪 4891 peng4 +椫 4895 zhan3shan4 +椬 4391 yi2 +椭橢 4492 tuo3 ellipse 3825 +椮 4392 sen1shen1 +椯 4292 duo2 +椰 4792 ye2ye1 3753 +椱 4894 fou4 +椲㭏 4595 wei3 +椳 4693 wei1 +椴 4794 duan4 +椵 4794 jia3jia1 +椶 4294 zong1 +椷 4395 jian1han2 +椸 4891 yi2 +椹 4491 shen4zhen1 +椺 4699 xi2 +椻 4191 yan4 +椼 4192 yan3 +椽 4793 chuan2 +椾 4892 zhan4jian1 +椿 4596 chun1 3594 +楀 4292 yu3ju3 +楁 4396 he2 +楂 4491 zha1cha2cha1 +楃 4791 wo4 +楄 4392 pian2 +楅 4196 bi4 +楆 4194 yao1 +楇 4792 huo4 +楈 4792 xu1 +楉 4496 ruo4 +楊杨 4692 yang2 +楋 4290 la4 +楌 4092 yan2 +楍 4066 ben3 +楎 4795 hun2hui1 +楏 4491 kui2 +楐 4692 jie4 +楑 4298 kui2kui3 +楒 4693 si1 +楓枫 4791 feng1 +楔 4798 xie1xie4 +楕 4492 tuo3 +楖 4792 zhi4ji2 +楗 4594 jian4jian3 +楘 1890 mu4 +楙 4499 mao4 +楚 4480 chu3 747 +楛 4496 hu4ku3 +楜 4792 hu2 +楝 4599 lian4 +楞 4692 leng2leng4 2927 +楟 4092 ting2 +楠 4492 nan2 3222 +楡 4892 yu2 +楢 4896 you2 +楣 4796 mei2 3377 +楤 4793 song3 +楥 4294 xuan4yuan2 +楦 4391 xuan4 +楧 4498 ying1 +楨桢 4198 zhen1zheng1 +楩 4194 pian2 +楪 4499 ye4die2 +楫 4694 ji2 +楬 4692 jie2qia4 +業业 3290 ye4 +楮 4496 chu3zhu1 +楯 4296 shun3 +楰 4798 yu2 +楱 4598 cou4zou4 +楲 4395 wei1 +楳 4499 mei2 +楴 4092 di4 +極极 4791 ji2 +楶 3790 jie2 +楷 4296 kai3jie1 3053 +楸 4998 qiu1 +楹 4791 ying2 +楺 4799 rou2 +楻 4691 heng2 +楼樓 4994 lou2 632 +楽 3290 le4 +楾 4699 quan2 +楿 4296 xiang1 +榀 4696 pin3 +榁 4391 shi3 +概 4191 gai4 918 +榃 4460 tan2 +榄欖 4891 lan3 olive 3988 +榅榲 4691 yun2 +榆 4892 yu2 3202 +榇櫬 4099 chen4 +榈櫚 4792 lv2 +榉櫸 4995 ju3 +榊 4590 shen2 +榋 4797 chu1 +榌 4291 bi1 +榍 4792 xie4 +榎 4194 jia3 +榏 4891 yi4 +榐 4793 zhan3 +榑 4394 fu4fu2 +榒 4792 nai4 +榓 4391 mi4 +榔 4792 lang2lang3 +榕 4396 rong2 3724 +榖 4794 gu3 +榗 4196 jian4 +榘 8190 ju3 +榙 4496 ta3 +榚 4893 yao3 +榛 4599 zhen1 +榜 4092 bang3bang4 2274 +榝 4794 sha1 +榞 4199 yuan2 +榟 4394 zi3 +榠 4798 ming2 +榡 4599 su4 +榢 4393 jia4 +榣 4797 yao2 +榤 4599 jie2 +榥 4691 huang3huang4 +榦 4849 gan4gan1 +榧 4191 fei3 +榨 4391 zha4 3945 +榩 4294 qian2 +榪杩 4192 ma4ma3 +榫 4094 sun3 +榬 4493 yuan2 +榭 4490 xie4 3842 +榮荣 9990 rong2 +榯 4494 shi2 +榰 4496 zhi1 +榱 4093 cui1 +榲榅 4691 yun2 +榳 4394 ting2 +榴 4796 liu2 3323 +榵 4494 rong2 +榶 4096 tang2 +榷 4491 que4 +榸 4691 zhai1 +榹 4291 si1 +榺 7929 sheng4 +榻 4692 ta4 2751 +榼 4491 ke4 +榽 4298 xi1 +榾 4792 gu4gu3 +榿桤 4291 qi1 +槀 0090 kao3gao3 +槁 4092 gao3kao4gao1 +槂 4299 sun1 +槃 2790 pan2 +槄 4297 tao1 +槅 4192 ge2he2 +槆 4492 xun2 +槇 4498 dian1 +槈 4194 nou4 +槉 4098 ji2 +槊 8790 shuo4 +構构 4594 gou4 +槌 4793 chui2 +槍枪 4896 qiang1cheng1 +槎 4891 cha2cha1zha1 +槏 4893 qian3 +槐 4691 huai2 2906 +槑 6699 mei2 +槒 4096 xu4chu4 +槓 4198 gang4 +槔 4694 gao1 +槕 4199 zhuo2zhuo1 +槖 4090 tuo4tuo2 +槗 4492 qiao2 +様 4899 yang4 +槙 4498 dian1 +槚檟 4198 jia3 +槛檻 4891 jian4kan3 2964 +槜 4092 zui4 +槝 4792 dao3 +槞 4091 long2 +槟檳 4398 bin1bing1 3889 +槠櫧 4496 zhu1 +槡 4799 sang1 +槢 4796 xi2 +槣 4392 qi3 +槤梿 4593 lian2 +槥 4597 hui4 +槦 4092 yong2 +槧椠 5290 qian4 +槨椁 4792 guo3 +槩 7190 gai4 +槪 4191 gai4 +槫 4594 tuan2 +槬 4293 hua4 +槭 4395 cu4qi1se4 +槮 4392 sen1shen1 +槯 4291 cui1 +槰 4793 beng4 +槱 4198 you3you2 +槲 4490 hu2 +槳桨 2790 jiang3jiang1 +槴 4291 hu4 +槵 4593 huan4 +槶椢 4690 kui4 +槷 5590 yi4nie4 +槸 4591 nie4 +槹 4694 gao1 +槺 4399 kang1 +槻 4691 gui1 +槼 5690 gui1 +槽 4596 cao2zao1 slot 2749 +槾 4694 man2man4 +槿 4491 jin3qin2 +樀 4092 di4 +樁桩 4597 zhuang1chong1 +樂乐 2290 yue4le4 +樃 4792 lang2 +樄 4599 chen2 +樅枞 4898 cong1zong1 +樆 4092 li2 +樇 4792 xiu1 +樈 4091 qing2 +樉 4498 shuang3 +樊 4480 fan2 2520 +樋 4793 tong1 +樌 4798 guan4 +樍 4598 ji1 +樎 4396 suo1 +樏 4699 lei3lei2 +樐 4196 lu3 +樑 4799 liang2 +樒 4397 mi4 +樓楼 4594 lou2lv2 +樔 4299 chao2jiao3 +樕 4798 su4 +樖 8092 ke1 +樗 4192 chu1shu1 +樘 4991 tang2cheng1 +標标 4199 biao1 +樚 4091 lu4 +樛 4792 jiu1 +樜 4393 shu4 +樝 4191 zha1 +樞枢 4191 shu1 +樟 4094 zhang1 3824 +樠 4492 men2man2 +模 4498 mo2mu2 584 +樢㭤 4792 niao3 +樣样 4899 yang4xiang4 +樤 4799 tiao2 +樥 4495 peng2 +樦 4891 zhu4 +樧 4794 sha1 +樨 4795 xi1 +権 4891 quan2 +横橫 4498 heng2 1076 +樫㭴 4791 jian1 +樬 4693 cong1 +樭 4491 ji1 +樮 4198 yan1 +樯檣 4894 qiang2 +樰 4197 xue3 +樱櫻 4794 ying1 2671 +樲 4394 er4 +樳 4794 xin2 +樴 4395 zhi2 +樵 4093 qiao2 3031 +樶 4694 zui1 +樷 4444 cong2 +樸朴 4298 pu2pu3 +樹树 4490 shu4 +樺桦 4495 hua4 +樻 4798 kui4 +樼 4794 zhen1 +樽 4894 zun1zun3 +樾 4398 yue4 +樿椫 4695 zhan3shan4 +橀 4091 xi1 +橁 4892 xun2chun1 +橂 4898 dian4 +橃 4294 fa1 +橄 4894 gan3 3996 +橅 4893 mo2mu2 +橆 8099 wu3 +橇 4291 qiao1 +橈桡 4491 nao2rao2 +橉 4995 lin4 +橊 4196 liu2 +橋桥 4292 qiao2 +橌 4792 xian4 +橍 4792 run4 +橎 4296 fan2 +橏 4896 zhan3shan3 +橐 4090 tuo2 +橑 4399 lao3liao2 +橒 4193 yun2 +橓 4295 shun4 +橔 4894 tui2 +橕 4994 cheng1 +橖 4999 tang2 +橗 4492 meng2 +橘 4792 ju2 3487 +橙 4291 cheng2 3307 +橚 4592 su4 +橛 4198 jue2 +橜 7129 jue2 +橝 4194 tan1tan2 +橞 4593 hui4 +機机 4295 ji1 +橠 4093 nuo3 +橡 4793 xiang4 3041 +橢椭 4492 tuo3duo3 +橣 4392 ning3 +橤 3390 rui3 +橥櫫 4490 zhu1 +橦 4091 tong2chuang2 +橧 4896 zeng1 +橨 4498 fen2 +橩 4991 qiong2 +橪 4393 ran3 +橫横 4498 heng2heng4 +橬 4196 cen2 +橭 4494 gu1 +橮 4798 liu3 +橯 4992 lao4 +橰 4694 gao1 +橱櫥 4194 chu2 3122 +橲 4496 xi3 +橳 4992 sheng4 +橴 4299 zi3 +橵 4894 zan1 +橶 4395 ji2 +橷 4291 dou1 +橸 4696 jing1 +橹櫓 4796 lu3 +橺 4792 xian4 +橻 4791 cu1 +橼櫞 4793 yuan2 +橽 4493 ta4 +橾 4699 shu1 +橿 4191 jiang1 +檀 4091 tan2shan4 3285 +檁檩 4099 lin3 +檂 4593 nong2 +檃 7290 yin3 +檄 4894 xi2 +檅 4195 sui4 +檆 4196 shan1sha1 +檇 4092 zui4 +檈 4693 xuan2 +檉柽 4691 cheng1 +檊 4894 gan4 +檋 4495 ju1ju2 +檌 4691 zui4 +檍 4093 yi4 +檎 4892 qin2 +檏 4299 pu3 +檐 4796 yan2dan1 3000 +檑 4196 lei2lei4 +檒 4421 feng1 +檓 4794 hui3 +檔档 4997 dang4dang3 +檕 5790 ji4xi4 +檖 4893 sui4 +檗 7090 bo4bi4 +檘 4094 bi4 +檙 4292 ding3 +檚 4498 chu3 +檛 4793 zhua1 +檜桧 4896 gui4kuai4hui4 +檝 4395 ji2 +檞 4795 jie3xie4 +檟槚 4198 jia3 +檠 4890 qing2jing4 +檡 4694 zhe4shi4 +檢检 4898 jian3 +檣樯 4496 qiang2 +檤 4893 dao4 +檥 4895 yi3 +檦 4199 biao3 +檧 4493 song1 +檨 4898 she1 +檩檁 4099 lin3 +檪 4299 li4 +檫 4399 cha2sa4 +檬 4493 meng2 3894 +檭 5793 yin2 +檮梼 4494 tao2dao3 +檯台 4491 tai2 +檰 4692 mian2 +檱 4898 qi2ji1 +檲 4690 tuan2 +檳槟 4398 bin1bing1 +檴 4494 huo4 +檵 4291 ji4qi3 +檶 4491 qian1 +檷 4192 mi2 +檸柠 4392 ning2 +檹 4892 yi1 +檺 4093 gao3 +檻槛 4891 jian4kan3 +檼 4293 yin4yin3 +檽 4192 er2nou4 +檾 9999 qing3 +檿 7129 yan3 +櫀 4499 qi2 +櫁 4393 mi4 +櫂 4791 zhao4zhuo1 +櫃柜 4191 gui4 +櫄 4293 chun1 +櫅 4092 ji1 +櫆 4491 kui2 +櫇 4198 po2 +櫈 4291 deng4 +櫉 4194 chu2 +櫊 4792 ge2 +櫋 4692 mian2 +櫌 4194 you1 +櫍 4298 zhi4 +櫎 4098 guang4huang3 +櫏 4193 qian1 +櫐 6090 lei3 +櫑 4696 lei3lei2 +櫒 4499 sa4 +櫓橹 4796 lu3 +櫔 4192 li4 +櫕 4598 cuan2 +櫖 4193 lv2 +櫗 4495 mie4 +櫘 4593 hui4 +櫙 4491 ou1 +櫚榈 4792 lv2 +櫛栉 4892 jie2zhi4 +櫜 5090 gao1 +櫝椟 4498 du2 +櫞橼 4793 yuan2 +櫟栎 4299 li4lao2yue4 +櫠 4094 fei4 +櫡 4896 zhuo2zhu4 +櫢 4894 sou3 +櫣 4493 lian2 +櫤 4892 jiang2 +櫥橱 4094 chu2 +櫦 4094 qing4 +櫧槠 4496 zhu1 +櫨栌 4191 lu2 +櫩 4792 yan2 +櫪枥 4191 li4 +櫫橥 1490 zhu1 +櫬榇 4691 chen4 +櫭 4191 jie2ji4 +櫮 4191 e4 +櫯 4299 su1 +櫰 4093 huai2 +櫱蘖 4490 nie4 +櫲 4793 yu4 +櫳栊 4191 long2 +櫴 4798 lai4 +櫵 4493 qiao2 +櫶 4393 xian3 +櫷 4791 gui1 +櫸榉 4795 ju3 +櫹 4492 xiao1 +櫺 4196 ling2 +櫻樱 4694 ying1 +櫼 5395 jian1 +櫽 7290 yin3 +櫾 4299 you2you4 +櫿 4996 ying2 +欀 4093 xiang1 +欁 4499 nong2 +欂 4494 bo2 +欃 4791 chan2 +欄栏 4792 lan2lian4 +欅 4795 ju3 +欆 4094 shuang1 +欇 4194 she4 +欈 4292 wei2 +欉 4394 cong4 +權权 4491 quan2 +欋 4691 qu2 +欌 4495 cang2 +欍 4497 jiu4 +欎 4474 yu4 +欏椤 4691 luo2luo3 +欐 4191 li3li4 +欑 4498 zan4 +欒栾 2290 luan2 +欓 4993 dang3 +欔 4694 jue2 +欕 4694 yan2 +欖榄 4891 lan3 +欗 4492 lan2 +欘 4792 zhu3zhu2 +欙 4699 lei2 +欚 4793 li3 +欛 4192 ba4 +欜 4593 nang2 +欝 4474 yu4 +欞棂 4191 ling2 +欟 4691 guan4 +欠 2780 qian4 u 1637 +次 3718 ci4 times 156 +欢歡 7748 huan1 joyous 515 +欣 7728 xin1 1310 +欤歟 2718 yu2 +欥 6708 yu4 +欦 8728 qian1 +欧歐 7778 ou1 europe 972 +欨 2768 xu1 +欩 1768 chao1 +欪 2778 chu4 +欫 8708 qi1 +欬 0788 kai4ke2 +欭 6708 yi4 +欮 8748 jue2 +欯 4768 xi2 +欰 2708 xu1 +欱 8768 he1 +欲 8768 yu4 899 +欳 2728 kuai4 +欴 3778 lang2 +欵 2788 kuan3 +欶 5798 shuo4 +欷 4728 xi1 +欸 2788 ai3ai1ei1ei4 +欹 4768 yi1qi1 +欺 4788 qi1 1537 +欻 9788 xu1chua1 +欼 7748 chi3 +欽钦 8718 qin1 +款 4798 kuan3xin1 1075 +欿 2778 kan3 +歀 4798 kuan3 +歁 4778 kan3 +歂 2728 chuan2chuan3 +歃 2778 sha4xia2 +歄 7728 gua1 +歅 1718 yin1yan1 +歆 0768 xin1 +歇 6778 xie1ya4 1909 +歈 8728 yu2 +歉 8728 qian4 2206 +歊 0728 xiao1 +歋 7728 yi2 +歌 1768 ge1 916 +歍 2738 wu1 +歎 4758 tan4 +歏 4718 jin4 +歐欧 7778 ou1 +歑 2728 hu1 +歒 0728 ti4 +歓 8728 huan1 +歔 2728 xu1 +歕 0788 pen1 +歖 4768 xi1 +歗 5728 xiao4 +歘 9788 xu1chua1 +歙 8718 xi1she4 +歚 8768 shan4 +歛 8788 han1lian3 +歜 6718 chu4 +歝 6748 yi4 +歞 6738 kan3 +歟欤 7788 yu2 +歠 7768 chuo4 +歡欢 4728 huan1 +止 2110 zhi3 u 561 +正 1010 zheng4zheng1 108 +此 2111 ci3 91 +步 2120 bu4 step 251 +武 1314 wu3 495 +歧 2414 qi2 2332 +歨 2180 bu4 +歩 2120 bu4 +歪 1010 wai1wai3 2093 +歫 2111 ju4 +歬 2144 qian2 +歭 2414 chi2 +歮 2111 se4 +歯 2177 chi3 +歰 1711 se4sha4 +歱 2211 zhong3 +歲岁 2125 sui4 +歳 2125 sui4 +歴 7121 li4 +歵 2518 cuo4 +歶 2222 yu2 +歷历 7121 li4 +歸归 2712 gui1 +歹 1020 dai3 u 2264 +歺 2120 dai3 +死 1021 si3 dead 342 +歼殲 1224 jian1 3312 +歽 1222 zhe2 +歾 1722 mo4wen3 +歿殁 1724 mo4 +殀 1228 yao3yao1 +殁歿 1724 mo4wen3 +殂 1721 cu2 +殃 1528 yang1 3272 +殄 1822 tian3 +殅 1521 sheng1 +殆 1326 dai4 2908 +殇殤 1822 shang1 +殈 1721 xu4 +殉 1722 xun4 3443 +殊 1529 shu1 1353 +残殘 1325 can2 1122 +殌 1121 jue2 +殍 1224 piao3bi4 +殎 1428 qia4 +殏 1329 qiu4 +殐 1529 su4 +殑 1421 qing2jing4 +殒殞 1628 yun3 +殓殮 1821 lian4 +殔 1529 yi4 +殕 1026 fou3 +殖 1421 zhi2shi4 2390 +殗 1421 ye4 +殘残 1325 can2 +殙 1226 hun1 +殚殫 1825 dan1 +殛 1721 ji2 +殜 1429 ye4die2 +殝 1529 zhen1 +殞殒 1628 yun3 +殟 1621 wen1 +殠 1628 chou4 +殡殯 1328 bin4 3428 +殢 1422 ti4ni4 +殣 1421 jin4jin3 +殤殇 1822 shang1 +殥 1328 yin2 +殦 1722 diao1 +殧 1321 cu4 +殨㱮 1528 hui4 +殩 1729 cuan4 +殪 1421 yi4 +殫殚 1625 dan1 +殬 1624 du4 +殭 1121 jiang1 +殮殓 1828 lian4 +殯殡 1328 bin4 +殰㱩 1428 du2 +殱 1325 jian1 +殲歼 1325 jian1 +殳 7740 shu1 u +殴毆 7774 ou1 3291 +段 7744 duan4 paragraph 490 +殶 0714 zhu4 +殷 2724 yin1 1788 +殸 4724 qing4 +殹 7774 yi4 +殺杀 4794 sha1 +殻壳 4724 ke2qiao4 +殼壳 4724 ke2qiao4 +殽 4724 yao2 +殾 4764 jun4 +殿 7724 dian4 1560 +毀毁 7714 hui3 +毁毀 7714 hui3 1488 +毂轂 4754 gu3 wheel +毃 0724 que4 +毄 5764 ji1 +毅 0724 yi4 1903 +毆殴 7774 ou1kou1qu1 +毇 7794 hui3 +毈 7724 duan4 +毉 7710 yi1 +毊 4722 xiao1 +毋 7750 wu2 u 2805 +毌 7775 guan4 +母 7775 mu3 517 +毎 8075 mei3 +每 8075 mei3 308 +毐 4055 ai3 +毑 7471 jie3 +毒 5075 du2dai4 poison 885 +毓 8071 yu4 3568 +比 2271 bi3 u than 197 +毕畢 2240 bi4 865 +毖 2233 bi4 +毗 6201 pi2 3592 +毘 6071 pi2 +毙斃 2221 bi4 2889 +毚 2721 chan2 +毛 2071 mao2 u 762 +毜 2971 hao2 +毝 2271 cai3 +毞 2271 pu2 +毟 9071 lie3 +毠 4671 jia1 +毡氈 2171 zhan1 3341 +毢 2171 sai1 +毣 1771 mu4 +毤 8221 tuo4 +毥 2771 xun2 +毦 1241 er4er3 +毧 2371 rong2 +毨 2471 xian3 +毩 2971 ju2 +毪 2371 mu2 +毫 0071 hao2 999 +毬 2371 qiu2 +毭 1211 dou4 +毮 5901 sha1 +毯 2971 tan3 2743 +毰 2071 pei2 +毱 2771 ju2 +毲 7241 duo2 +毳 2071 cui4 +毴 2171 bi1 +毵毿 2221 san1 +毶 2371 san1 +毷 6261 mao4 +毸 2671 sui1sai1 +毹 8221 shu1 +毺 2871 yu1 +毻 4221 tuo4 +毼 6271 he2 +毽 2571 jian4 +毾 6211 ta4 +毿毵 2221 san1 +氀 5241 lv2 +氁 2471 mu2 +氂牦 4771 mao2li2 +氃 0211 tong2 +氄 1221 rong3 +氅 9871 chang3 +氆 2871 pu3bang3 +氇氌 2771 luo2 +氈毡 0211 zhan1 +氉 6291 sao4 +氊 2071 zhan1 +氋 4221 meng2 +氌氇 2771 luo2lu3 +氍 6221 qu2 +氎 6211 die2 +氏 7274 shi4zhi1 u 1137 +氐 7274 di3di1zhi1 +民 7774 min2 277 +氒 7240 jue2 +氓 0774 mang2meng2 3130 +气氣 8001 qi4 u 215 +氕 8021 pie1 +氖 8021 nai3 neon +気 8041 qi4 +氘 8021 dao1 +氙 8071 xian1 xenon +氚 8021 chuan1 +氛 8021 fen1 2043 +氜 8061 ri4 +氝 8021 nei4 +氞 8021 nei4 +氟 8051 fu2 fluorine 3891 +氠 8051 shen1 +氡 8031 dong1 radon +氢氫 8011 qing1 hydrogen +氣气 8091 qi4 +氤 8061 yin1yan2 +氥 8061 xi1 +氦 8081 hai4 helium +氧 8051 yang3 oxygen 3472 +氨 8042 an1 3972 +氩氬 8011 ya4 argon +氪 8021 ke4 krypton +氫氢 8011 qing1 +氬氩 8011 ya4 +氭 8091 dong1 +氮 8081 dan4 nitrogen 3769 +氯 8091 lv4 chlorine +氰 8021 qing2 +氱 8021 yang3 +氲氳 8011 yun1 +氳氲 8011 yun1 +水 1290 shui3 u water 167 +氵 3010 shui3 +氶 1790 zheng3 +氷 3290 bing1 +永 3090 yong3 707 +氹 1271 dang4 +氺 9090 shui3 +氻 3412 le4 +氼 1280 ni4 +氽 8090 tun3 +氾 3711 fan4 +氿 3411 gui3 +汀 3112 ting1 3205 +汁 3410 zhi1 juice 2354 +求 4390 qiu2 234 +汃 3810 bin1pa4 +汄 3810 ze4 +汅 3112 mian3 +汆 8090 cuan1 +汇匯 3111 hui4 1564 +汈 3712 diao1 +汉漢 3714 han4 564 +汊 3714 cha4 +汋 3712 zhuo2yue4 +汌 3210 chuan4 +汍 3511 wan2 +汎 3711 fan4feng3 +汏 3418 da4tai4 +汐 3712 xi4xi1 +汑 3211 tuo1 +汒 3011 mang2 +汓 3714 qiu2 +汔 3811 qi4 +汕 3217 shan4 3576 +汖 2290 pai4 +汗 3114 han4han2 1519 +汘 3214 qian1 +汙 3114 wu1 +汚 3112 wu1 +汛 3711 xun4 3586 +汜 3711 si4 +汝 3414 ru3 2108 +汞 1029 gong3 mercury +江 3111 jiang1 451 +池 3411 chi2 pond 1393 +污 3112 wu1 1491 +汢 3411 tu3 +汣 3718 jiu3 +汤湯 3712 tang1shang1 soup 1497 +汥 3414 zhi1 +汦 3214 chi2 +汧 3114 qian1 +汨 3610 mi4 +汩 3610 gu3yu4hu2 +汪 3111 wang1 1680 +汫 3510 qing4 +汬 5590 jing3 +汭 3412 rui4 +汮 3712 jun1 +汯 3413 hong2 +汰 3413 tai4 3066 +汱 3318 quan3 +汲 3714 ji2 2979 +汳 3214 bian4 +汴 3013 bian4 +汵 3812 gan4 +汶 3014 wen4men2 3733 +汷 3814 zhong1 +汸 3012 fang1 +汹洶 3217 xiong1 2922 +決决 3518 jue2 +汻 3814 hang3 +汼 5510 niu2 +汽 3811 qi4 1761 +汾 3812 fen2 3598 +汿 3712 xu4 +沀 1792 xu4 +沁 3310 qin4 2809 +沂 3212 yi2yin2 3494 +沃 3218 wo4 2599 +沄 3113 yun2 +沅 3111 yuan2 3516 +沆 3011 hang4 +沇 3311 yan3 +沈瀋 3411 shen3chen2 1207 +沉 3711 chen2 742 +沊 4201 dan4 +沋 3311 you2 +沌 3511 dun4 3357 +沍 3111 hu4 +沎 3410 huo4 +沏 3712 qi1 3932 +沐 3419 mu4 2811 +沑 3711 rou2 +沒没 3714 mei2mo4 +沓 1260 ta4da2 3509 +沔 3112 mian3 +沕 3712 wu4mi4 +沖冲 3510 chong1 +沗 1090 ong2pang1 +沘 3211 bi3 +沙 3912 sha1sha4 sand 703 +沚 3111 zhi3 +沛 3512 pei4 2609 +沜 3212 pan4 +沝 1299 zhui3 +沞 3112 za1 +沟溝 3712 gou1 1772 +沠 3212 liu2 +没沒 3714 mei2mo4 no 115 +沢 3718 ze2 +沣灃 3510 feng1 +沤漚 3111 ou4ou1 +沥瀝 3112 li4 3350 +沦淪 3811 lun2 2887 +沧滄 3811 cang1 2539 +沨 3711 feng1 +沩溈 3412 wei2 +沪滬 3310 hu4 3316 +沫 3519 mo4 2683 +沬 3519 mei4hui4 +沭 3319 shu4 +沮 3711 ju3ju4 3148 +沯 1260 za2 +沰 3116 tuo1 +沱 3311 tuo2 +沲 3811 tuo2duo4 +河 3112 he2 river 619 +沴 3812 li4 +沵 3719 mi3 +沶 3119 yi2 +沷 3314 fa1 +沸 3512 fei4fu2 2621 +油 3516 you2 oil 956 +沺 3610 tian2 +治 3316 zhi4 479 +沼 3716 zhao3 3110 +沽 3416 gu1gu3 3641 +沾 3116 zhan1 2196 +沿 3816 yan2yan4 1257 +泀 3712 si1 +況况 3611 kuang4 +泂 3712 jiong3 +泃 3712 ju4ju1 +泄 3411 xie4yi4 1948 +泅 3610 qiu2you1 +泆 3518 yi1yi4 +泇 3610 jia1 +泈 3713 zhong1 +泉 2629 quan2 1414 +泊 3610 bo2po1 2133 +泋 3414 hui4 +泌 3310 mi4bi4 3529 +泍 3513 ben1 +泎 3812 zhuo2 +泏 3217 chu4 +泐 3412 le4 +泑 3412 you3you1 +泒 3213 gu1 +泓 3213 hong2 3738 +泔 3417 gan1han4 +法 3413 fa3 law 61 +泖 3712 mao3 +泗 3610 si4 +泘 3214 hu1 +泙 3114 ping2peng1 +泚 3211 ci3 +泛 3213 fan4 1289 +泜 3214 zhi1 +泝 3214 su4 +泞濘 3312 ning4 3930 +泟 3111 cheng1 +泠 3813 ling2 +泡 3711 pao4pao1 2130 +波 3414 bo1 740 +泣 3011 qi4 2163 +泤 3810 si4 +泥 3711 ni2ni4 mud 1463 +泦 3711 ju2 +泧 3315 yue4 +注註 3011 zhu4 pour 428 +泩 3511 sheng1 +泪淚 3610 lei4 tear 1104 +泫 3013 xuan4 +泬 3318 xue4jue2 +泭 3410 fu1fu2 +泮 3915 pan4 +泯 3714 min3 +泰 5019 tai4 1214 +泱 3518 yang1 +泲 3512 ji3 +泳 3319 yong3 2524 +泴 1210 guan4 +泵 1029 beng4 3890 +泶澩 9090 xue2 +泷瀧 3311 long2shuang1 +泸瀘 3110 lu2 +泹 3611 dan4 +泺濼 3219 luo4po1 +泻瀉 3712 xie4 2955 +泼潑 3314 po1bo1 2088 +泽澤 3715 ze2 1226 +泾涇 3711 jing1 +泿 3713 yin2 +洀 3714 zhou1pan2 +洁潔 3416 ji2jie2 clean 1240 +洂 3013 yi4 +洃 3418 hui1 +洄 3610 hui2hui4 +洅 3114 zui3 +洆 3711 cheng2 +洇 3610 yin1 +洈 3711 wei2 +洉 3216 hou4 +洊 3414 jian4 +洋 3815 yang2 ocean 928 +洌 3210 lie4 +洍 3111 si4 +洎 3610 ji4 +洏 3112 er2 +洐 3211 xing2 +洑 3318 fu2fu4 +洒灑 3116 sa3 spill sprinkle 1981 +洓 3519 se4 +洔 3414 zhi3 +洕 3812 yin1 +洖 3618 wu2 +洗 3411 xi3xian3 wash 1043 +洘 3412 kao3 +洙 3519 zhu1 +洚 3715 jiang4 +洛 3716 luo4 1188 +洜 2790 luo4 +洝 3314 an4 +洞 3712 dong4 hole 1068 +洟 3518 yi2ti4 +洠 3315 mou2 +洡 3519 lei3 +洢 3710 yi1 +洣 3919 mi3 +洤 3811 quan2 +津 3510 jin1 1471 +洦 3116 mo4 +洧 3412 wei3 +洨 3014 xiao2 +洩 3510 xie4 +洪 3418 hong2 1285 +洫 3711 xu4yi4 +洬 3711 shuo4 +洭 3111 kuang1 +洮 3211 tao2yao2dao4tao1 +洯 5790 qie4jie2 +洰 3111 ju4 +洱 3114 er3 +洲 3210 zhou1 1181 +洳 3610 ru4ru2 +洴 3814 ping2 +洵 3712 xun2 +洶汹 3712 xiong1 +洷 3111 zhi4 +洸 3911 guang1huang2 +洹 3111 huan2 +洺 3716 ming2 +活 3216 huo2 live 248 +洼窪 3411 wa1 3366 +洽 3816 qia4 2702 +派 3213 pai4 send 595 +洿 3412 wu1 +浀 3516 qu3 +流 3411 liu2 flow 289 +浂 3818 yi4 +浃浹 3518 jia1 +浄 3715 jing4 +浅淺 3315 qian3 shallow 1659 +浆漿 3790 jiang1jiang4 2619 +浇澆 3511 jiao1ao4 2785 +浈湞 3118 cheng2zhen1 +浉 3112 shi1 +浊濁 3513 zhuo2 2819 +测測 3210 ce4 1065 +浌 3315 fa2 +浍澮 3813 kuai4hui4 +济濟 3012 ji4ji3 710 +浏瀏 3210 liu2 2891 +浐滻 3010 chan3 +浑渾 3715 hun2 1826 +浒滸 3814 hu3 +浓濃 3413 nong2 thick 1411 +浔潯 3714 xun2 +浕 3713 jin4 +浖 3214 lie4 +浗 3319 qiu2 +浘 3711 wei3 +浙 3212 zhe4 2237 +浚 3314 jun4xun4 3414 +浛 3816 han4han2 +浜 3218 bang1bin1 +浝 3311 mang2 +浞 3618 zhuo2 +浟 3814 you2di2 +浠 3412 xi1 +浡 3414 bo2 +浢 3111 dou4 +浣 3311 huan4 3632 +浤 3313 hong2 +浥 3611 yi4 +浦 3312 pu3 2256 +浧 3611 ying3 +浨 3319 lan3 +浩 3416 hao4 grand 1605 +浪 3313 lang4 996 +浫 3714 han3 +浬 3611 li3 +浭 3114 geng1 +浮 3214 fu2 1332 +浯 3116 wu2 +浰 3210 li4 +浱 3113 chun2 +浲 3715 feng2 +浳 3312 yi4 +浴 3816 yu4 2250 +浵 3202 tong2 +浶 3315 lao2 +海 3815 hai3 sea 252 +浸 3714 jin4 2364 +浹浃 3418 jia1 +浺 3510 chong1 +浻 3712 weng3 +浼 3711 mei3 +浽 3214 sui1 +浾 3413 cheng1 +浿 3618 pei4 +涀 3611 xian4 +涁 3212 shen4 +涂塗 3819 tu2 1668 +涃 3610 kun4 +涄 3512 pin1 +涅 3611 nie4 3171 +涆 3114 han4 +涇泾 3111 jing1 +消 3912 xiao1 397 +涉 3112 she4die2 1382 +涊 3713 nian3 +涋 3318 tu1 +涌 3712 yong3chong1 1468 +涍 3414 xiao4 +涎 3214 xian2yan4dian4 3673 +涏 3214 ting3 +涐 3315 e2 +涑 3519 su4sou1shu4 +涒 3716 tun1 +涓 3612 juan1yuan4xuan4 3942 +涔 3212 cen2qian2zan4 +涕 3812 ti4 3057 +涖 3011 li4 +涗 3811 shui4 +涘 3318 si4 +涙 3318 lei4 +涚 3811 shui4 +涛濤 3414 tao1 1598 +涜 3418 du2 +涝澇 3412 lao4lao2 +涞淶 3519 lai2 +涟漣 3413 lian2 3648 +涠潿 3610 wei2 +涡渦 3612 wo1guo1 3133 +涢 3618 yun2 +涣渙 3718 huan4 3829 +涤滌 3719 di2 3217 +涥 3012 heng1 +润潤 3712 run4 1621 +涧澗 3712 jian4 3090 +涨漲 3213 zhang3zhang4 1961 +涩澀 3711 se4 2679 +涪 3016 fu2pou2 +涫 3017 guan4 +涬 3414 xing4 +涭 3214 shou4 +涮 3210 shuan4 rinse +涯 3111 ya2 2415 +涰 3714 chuo4 +涱 3113 zhang4 +液 3014 ye4yi4shi4 1811 +涳 3311 kong1 +涴 3311 wo4wan3 +涵 3717 han2 2065 +涶 3211 tuo1 +涷 3519 dong1dong4 +涸 3610 he2hao4 3883 +涹 3214 wo1 +涺 3716 ju1 +涻 3816 gan4 +涼凉 3019 liang2liang4 +涽 3216 hun1 +涾 3216 ta4 +涿 3113 zhuo1zhuo2 +淀澱 3318 dian4 3546 +淁 3014 qie4 +淂 3614 de2 +淃 3911 juan4 +淄 3216 zi1 +淅 3212 xi1 +淆 3412 yao2xiao2 3611 +淇 3418 qi2 3477 +淈 3717 gu3 +淉 3619 guo3 +淊 3717 yan1 +淋 3419 lin2lin4 2312 +淌 3912 tang3chang3 3076 +淍 3712 zhou1 +淎 3515 peng3 +淏 3618 hao4 +淐 3616 chang1 +淑 3714 shu2 1985 +淒 3514 qi1 +淓 3412 fang1 +淔 3411 chi4 +淕 3411 lu4 +淖 3114 nao4chuo4zhuo1 +淗 3712 ju2 +淘 3712 tao2 2360 +淙 3319 cong2shuang4 +淚泪 3318 lei4li4 +淛 3210 zhi4zhe4 +淜 3712 peng2ping2 +淝 3711 fei2 +淞 3813 song1 +淟 3518 tian3 +淠 3612 pi4pei4 +淡 3918 dan4 1069 +淢 3315 yu4xu4 +淣 3711 ni2 +淤 3813 yu1 3474 +淥渌 3719 lu4 +淦 3811 gan4 +淧 3313 mi4 +淨 3215 jing4 +淩 3414 ling2 +淪沦 3812 lun2 +淫 3211 yin2 2165 +淬 3014 cui4 +淭 3319 qu2 +淮 3011 huai2 2151 +淯 3012 yu4 +淰 3813 nian3shen3 +深 3719 shen1 deep 292 +淲 3111 piao2 +淳 3014 chun2zhun1 2773 +淴 3713 wa4hu1 +淵渊 3210 yuan1 +淶涞 3419 lai2 +混 3611 hun4hun3 1053 +淸 3512 qing1 +淹 3411 yan1yan3 2551 +淺浅 3315 qian3jian1 +添 3213 tian1tian4 add 1554 +淼 1299 miao3 +淽 3411 zhi3 +淾 8090 yin3 +淿 3612 mi4 +渀 3414 ben1 +渁 3219 yuan1 +渂 3614 wen4 +渃 3416 re4ruo4 +渄 3111 fei1 +清 3512 qing1 266 +渆 1210 yuan1 +渇 3612 ke3 +済 3012 ji4 +渉 3112 she4die2 +渊淵 3210 yuan1 2031 +渋 3118 se4 +渌淥 3719 lu4 +渍漬 3518 zi4 3152 +渎瀆 3418 du2dou4 3451 +渏 3412 yi1 +渐漸 3212 jian4jian1 752 +渑澠 3611 mian3sheng2 +渒 3614 pi4 +渓 3218 xi1 +渔漁 3711 yu2 2068 +渕 3210 yuan1 +渖瀋 3315 shen3 +渗滲 3312 shen4 2543 +渘 3719 rou2 +渙涣 3718 huan4hui4 +渚 3416 zhu3 +減减 3315 jian3 +渜 3118 nuan3 +渝 3812 yu2 3091 +渞 3816 qiu2 +渟 3012 ting2 +渠 3190 qu2ju4 2272 +渡 3014 du4 1430 +渢沨 3711 feng2feng1 +渣 3411 zha1 3386 +渤 3412 bo2 3908 +渥 3711 wo4ou4wu1 3774 +渦涡 3712 wo1guo1 +渧 3012 di4 +渨 3613 wei1wei3 +温溫 3611 wen1yun4 730 +渪 3212 ru2 +渫 3419 xie4 +測测 3210 ce4 +渭 3612 wei4 3333 +渮 3412 ge1 +港 3411 gang3 1313 +渰 3814 yan3yan1 +渱 3111 hong2 +渲 3311 xuan4 3549 +渳 3114 mi3er3 +渴 3612 ke3 thirst 1970 +渵 3416 mao2 +渶 3418 ying1 +渷 3012 yan3 +游 3814 you2liu2 532 +渹 3712 hong1qing4 +渺 3912 miao3 2916 +渻 3916 xing3 +渼 3818 mei3 +渽 3315 zai1 +渾浑 3715 hun4 +渿 3419 nai4 +湀 3218 kui2 +湁 3816 shi2 +湂 3612 e4 +湃 3115 pai4 3762 +湄 3716 mei2 +湅 3519 lian4 +湆 3016 qi4 +湇 3012 qi4 +湈 3419 mei2 +湉 3216 tian2 +湊凑 3518 cou4 +湋 3415 wei2 +湌 3813 can1 +湍 3212 tuan1zhuan1 3675 +湎 3116 mian3 +湏 3118 hui4 +湐 3610 po4 +湑 3712 xu3xu1 +湒 3614 ji2 +湓 3811 pen2pen4 +湔 3812 jian1 +湕 3514 jian3 +湖 3712 hu2 lake 815 +湗 3410 feng4 +湘 3610 xiang1 1951 +湙 3018 yi4 +湚 3211 yin4 +湛 3411 zhan4 2737 +湜 3618 shi2 +湝 3216 jie1 +湞浈 3118 cheng2zhen1 +湟 3611 huang2kuang4 +湠 3218 tan4 +湡 3612 yu2 +湢 3116 bi4 +湣 3716 min3hun1 +湤 3811 shi1 +湥 3314 tu2 +湦 3611 sheng1 +湧 3712 yong3 +湨 3618 qu4ju2 +湩 3211 zhong4dong4 +湪 3713 tuan4nuan3 +湫 3918 qiu1jiao3 +湬 2990 jiao3 +湭 3816 qiu2 +湮 3111 yin1yan1 +湯汤 3612 tang1shang1 +湰 3711 long2 +湱 3516 huo4 +湲 3214 yuan2 +湳 3412 nan3 +湴 3811 ban4 +湵 3818 you3 +湶 3619 quan2 +湷 3516 chui2 +湸 3011 liang4 +湹 3111 chan2 +湺 1619 yan2 +湻 1016 chun2zhun1 +湼 1711 nie4 +湽 1216 zi1 +湾灣 3012 wan1 bay gulf 1595 +湿濕 3611 shi1 wet moist 1778 +満 3412 man3 +溁 3419 ying2 +溂 3210 la4 +溃潰 3518 kui4 2444 +溄 3215 feng2hong2 +溅濺 3315 jian4jian1 3025 +溆漵 3714 xu4 +溇 3914 lv3lou2 +溈沩 3212 gui1wei2 +溉 3111 gai4xie4 3452 +溊 3714 bo1 +溋 3711 ying2 +溌 3214 po1 +溍 3116 jin4 +溎 3411 gui4 +溏 3016 tang2 +源 3119 yuan2 source 909 +溑 3918 suo3 +溒 3413 yuan2 +溓 3813 lian2nian2lian3 +溔 3813 yao3 +溕 3713 meng4 +準准 3040 zhun3 +溗 3219 sheng2 +溘 3411 ke4kai4 +溙 3519 tai4 +溚 3416 da2 +溛 3313 wa1 +溜 3716 liu1liu4 2022 +溝沟 3514 gou1 +溞 3713 sao1 +溟 3718 ming2 +溠 3811 zha4zha1 +溡 3414 shi2 +溢 3811 yi4 2195 +溣 3812 lun2 +溤 3112 ma3 +溥 3314 pu3 +溦 3814 wei2 +溧 3119 li4 +溨 3315 cai2 +溩 3712 wu4 +溪 3218 xi1qi1 1872 +溫温 3611 wen1 +溬 3811 qiang1 +溭 3614 ze2ce4 +溮 3112 shi1 +溯 3712 su4shuo4 2975 +溰 3211 yi1 +溱 3519 zhen1qin2 +溲 3714 sou1 +溳涢 3618 yun2 +溴 3618 xiu4 bromine 5000 +溵 3714 yin1 +溶 3316 rong2 2560 +溷 3610 hun4hun2 +溸 3519 su4 +溹 3419 su4suo4 +溺 3712 ni4niao4 3120 +溻 3612 ta4ta1 +溼 3111 shi1qi4 +溽 3114 ru4 +溾 3611 wei1 +溿 3915 pan4 +滀 3016 chu4xu4 +滁 3819 chu2 +滂 3012 pang1 +滃 3812 weng3weng1 +滄沧 3816 cang1 +滅灭 3315 mie4 +滆 3112 he2ge2 +滇 3418 dian1tian2zhen1 3619 +滈 3012 hao4 +滉 3611 huang3huang4 +滊 3811 xi4 +滋 3813 zi1ci2 1892 +滌涤 3819 di2 +滍 3213 zhi3zhi4 +滎荥 9990 xing2ying1ying2 +滏 3811 fu3 +滐 3519 jie2 +滑 3712 hua2gu3 1323 +滒 3112 ge1 +滓 3314 zi3 +滔 3217 tao1 2682 +滕 7990 teng2 2856 +滖 3013 sui1 +滗潷 3811 bi3bi4 +滘 3716 jiao4 +滙 3111 hui4 +滚滾 3013 gun3 roll 1331 +滛 3217 yin2 +滜 3614 ze2hao4 +滝 3011 long2 +滞滯 3412 zhi4 sluggish 2273 +滟灧 3711 yan4 +滠灄 3114 she4 +满滿 3412 man3men4 307 +滢瀅 3411 ying2 +滣 3116 chun2 +滤濾 3113 lv4 3321 +滥濫 3811 lan4 2396 +滦灤 3019 luan2 +滧 3814 yao2 +滨濱 3318 bin1 2201 +滩灘 3011 tan1 2217 +滪澦 3118 yu4 +滫 3712 xiu3 +滬沪 3311 hu4 +滭 3615 bi4 +滮 3211 biao1 +滯滞 3412 zhi4 +滰 3011 jiang3 +滱 3311 kou4 +滲渗 3312 shen4 +滳 3012 shang1 +滴 3012 di1 drop 1780 +滵 3317 mi4 +滶 3814 ao2 +滷卤 3116 lu3 +滸浒 3814 hu3xu3 +滹 3114 hu1hu3 +滺 3813 you2di2 +滻浐 3011 chan3 +滼 3411 fan4 +滽 3012 yong2rong2 +滾滚 3013 gun3 +滿满 3412 man3 +漀 4790 qing4 +漁渔 3713 yu2 +漂 3119 piao1piao3piao4 1634 +漃 3314 ji2 +漄 3211 ya2 +漅 3219 jiao3 +漆 3419 qi1 2268 +漇 3118 xi3 +漈 3719 ji4 +漉 3011 lu4 3946 +漊溇 3514 lv3lou2 +漋 3711 long2 +漌 3411 jin3 +漍 3610 guo2 +漎 3818 cong2song3 +漏 3712 lou4lou2 1792 +漐 4590 zhi2 +漑 3111 gai4 +漒 3213 qiang2 +漓灕 3012 li2 2924 +演 3318 yan3yan4 896 +漕 3516 cao2cao4 +漖 3814 jiao4 +漗 3613 cong1 +漘 3112 chun2qun2 +漙 3514 tuan2 +漚沤 3111 ou4ou1 +漛 3919 teng2 +漜 3411 ye3 +漝 3716 xi2 +漞 3211 mi4 +漟 3911 tang2 +漠 3418 mo4 1752 +漡 3812 shang1 +漢汉 3418 han4 +漣涟 3513 lian2 +漤灠 3414 lan3 +漥 3311 wa1 +漦 5829 li2 +漧 3811 qian2gan1 +漨 3713 feng2 +漩 3818 xuan2xuan4 +漪 3412 yi1 3744 +漫 3614 man4man2 1398 +漬渍 3518 zi4se4qi4 +漭 3414 mang3 +漮 3019 kang1 +漯 3619 ta4luo4lei3 +漰 3212 peng1 +漱 3718 shu4sou4 3502 +漲涨 3113 zhang3zhang4 +漳 3014 zhang1 3944 +漴 3219 chong2 +漵溆 3814 xu4 +漶 3513 huan4 +漷 3712 kuo4 +漸渐 3212 jian4jian1 +漹 3112 yan1 +漺 3418 chuang3 +漻 3712 liao2liu2 +漼 3211 cui3 +漽 3715 ti2 +漾 3819 yang4yang2 3082 +漿浆 2790 jiang1jiang4 +潀 3618 cong2 +潁颍 2198 ying3 +潂 3211 hong2 +潃 3812 xun2 +潄 3814 shu4sou4 +潅 3411 guan4huan4 +潆瀠 3419 ying2 +潇瀟 3412 xiao1 2605 +潈 3613 cong2zong1 +潉 3211 kun1 +潊 3114 xu4 +潋瀲 3814 lian4 +潌 3311 zhi4 +潍濰 3011 wei2 +潎 3814 pi4pie1 +潏 3712 jue2yu4 +潐 3013 jiao4 +潑泼 3214 po1bo1 +潒 3713 dang4 +潓 3513 hui4 +潔洁 3719 jie2 +潕 3813 wu3 +潖 3111 pa2 +潗 3019 ji2 +潘 3216 pan1 1965 +潙沩 3212 wei2 +潚 3512 xiao1 +潛潜 3516 qian2 +潜潛 3516 qian2 1469 +潝 3812 xi1xi4 +潞 3716 lu4 +潟 3712 xi4 +潠 3718 sun4xun4xuan4 +潡 3814 dun4 +潢 3418 huang2guang1 +潣 3712 min3 +潤润 3712 run4 +潥 3119 su4 +潦 3419 lao3lao4liao2 3492 +潧 3816 zhen1 +潨 3719 cong1 +潩 3618 yi4 +潪 3616 di2 +潫 3919 wan1 +潬 3614 dan4shan4 +潭 3114 tan2 2514 +潮 3712 chao2 tide 1231 +潯浔 3714 xun2yin2 +潰溃 3518 kui4xie4 +潱 3411 ye1 +潲 3912 shao4 +潳 3716 tu2 +潴瀦 3416 zhu1 pool pond +潵 3814 san4sa3 +潶 3613 hei1 +潷滗 3815 bi3bi4 +潸 3412 shan1 +潹 3419 chan2 +潺 3714 chan2 3599 +潻 3212 shu3 +潼 3011 tong2chong1zhong1 +潽 3816 pu3 +潾 3915 lin2 +潿涠 3610 wei2 +澀涩 3711 se4 +澁 3111 se4 +澂 3814 cheng2 +澃 2190 jiong4 +澄 3211 cheng2deng4 2292 +澅 3511 hua4 +澆浇 3411 jiao1ao4nao4 +澇涝 3912 lao4lao2 +澈 3814 che4 3131 +澉 3814 gan3han4 +澊 3814 cun1 +澋 3619 heng4jing3 +澌 3212 si1xi1 +澍 3410 shu4zhu4 +澎 3212 peng2peng1 3584 +澏 3612 han4 +澐 3113 yun2 +澑 3116 liu4liu1liu2 +澒 3118 hong4gong3 +澓 3814 fu2 +澔 3416 hao4 +澕 3415 he2 +澖 3712 xian1 +澗涧 3712 jian4 +澘 3416 shan1 +澙 3712 xi4 +澚 3712 ao4yu4 +澛 3716 lu3 +澜瀾 3712 lan2 2783 +澝 3312 ning4 +澞 3118 yu2 +澟 3019 lin3 +澠渑 3711 mian3sheng2 +澡 3619 zao3cao1 2846 +澢 3916 dang1 +澣 3814 huan4 +澤泽 3614 ze2shi4 +澥 3715 xie4 +澦滪 3118 yu4 +澧 3511 li3 +澨 3811 shi4 +澩泶 7790 xue2xiao4 +澪 3113 ling2 +澫 3412 man4 +澬 3718 zi1 +澭 3011 yong1 +澮浍 3816 kuai4hui4 +澯 3719 can4 +澰 3818 lian4 +澱淀 3714 dian4 +澲 3219 ye4 +澳 3718 ao4yu4 2527 +澴 3613 huan2 +澵 3212 zhen1 +澶 3011 chan2 +澷 3612 man4 +澸 3313 dan3 +澹 3716 dan4tan2 +澺 3013 yi4 +澻 3811 sui4 +澼 3014 pi4 +澽 3113 ju4 +澾㳠 3413 ta4 +澿 3419 qin2 +激 3814 ji1jiao4jiao1 733 +濁浊 3612 zhuo2 +濂 3013 lian2xian3 +濃浓 3513 nong2 +濄㳡 3713 guo1wo1 +濅 3314 jin4 +濆 3418 fen2fen4pen1 +濇 3416 se4 +濈 3315 ji2 +濉 3011 sui1 +濊 3115 hui4huo4wei4 +濋 3418 chu3 +濌 2216 ta4 +濍 3413 song1 +濎 3212 ding3 +濏 3113 se4 +濐 3616 zhu3 +濑瀨 3718 lai4 +濒瀕 3118 bin1 3475 +濓 3013 lian2 +濔 3112 mi3ni3 +濕湿 3613 shi1 +濖 3616 shu4 +濗 3412 mi4 +濘泞 3312 ning4 +濙 3918 ying2 +濚 3919 ying2 +濛 3413 meng2 +濜浕 3511 jin4 +濝 3419 qi2 +濞 3614 pi4bi4 +濟济 3012 ji4ji3qi2 +濠 3013 hao2 +濡 3112 ru2 3867 +濢 3714 zui3 +濣 3814 wo4 +濤涛 3414 tao1 +濥 3718 yin4 +濦 3213 yin3xi1yin1 +濧㳔 3410 dui4 +濨 3813 ci2 +濩 3414 huo4hu4 +濪 3711 jing4 +濫滥 3811 lan4 +濬 3116 jun4 +濭 3411 ai4 +濮 3218 pu2pu1 3819 +濯 3711 zhuo2zhao4 wash +濰潍 3011 wei2 +濱滨 3318 bin1 +濲 3714 gu3 +濳 3416 qian2 +濴 3919 xing2ying2 +濵 3318 bin1 +濶 3712 kuo4 +濷 1212 fei4 +濸 3416 cang1 +濹 3611 me4 +濺溅 3315 jian4jian1 +濻 3518 wei3dui4 +濼泺 3219 luo4bo2po1li4 +濽 3518 zan4cuan2 +濾滤 3113 lv4 +濿 3112 li4 +瀀 3114 you1 +瀁 3813 yang4yang3 +瀂澛 3716 lu3 +瀃 3612 si4 +瀄 3812 jie2 +瀅滢 3911 ying2 +瀆渎 3418 du2dou4 +瀇㲿 3018 wang3 +瀈 3715 hui1 +瀉泻 3312 xie4 +瀊 3711 pan2 +瀋沈 3316 shen3 +瀌 3013 biao1 +瀍 3011 chan2 +瀎 3415 mo4 +瀏浏 3210 liu2 +瀐 3315 jian1 +瀑 3619 pu4bao4 2920 +瀒 3416 se4 +瀓 3814 cheng2 +瀔 3714 gu3 +瀕濒 3118 bin1 +瀖 3111 huo4 +瀗 3313 xian4 +瀘泸 3111 lu2 +瀙 3611 qin1qin4 +瀚 3812 han4 3567 +瀛 3011 ying2 3514 +瀜 3513 yong1rong2 +瀝沥 3111 li4 +瀞 3215 jing4 +瀟潇 3412 xiao1 +瀠潆 3919 ying2 +瀡 3413 sui3 +瀢 3513 wei2 +瀣 3711 xie4 +瀤 3013 huai2 +瀥 3712 hao4 +瀦潴 3416 zhu1 +瀧泷 3111 long2shuang1 +瀨濑 3718 lai4 +瀩 3118 dui4 +瀪 8890 fan2 +瀫 3714 hu2 +瀬 3118 lai4 +瀭 3812 shu1 +瀮 3119 lian2 +瀯 3916 ying2 +瀰㳽 3112 mi2mi3 +瀱 3612 ji4 +瀲潋 3814 lian4 +瀳 3512 jian4 +瀴 3614 ying3ying1ying4 +瀵 3918 fen4 +瀶 3816 lin2 +瀷 3718 yi4 +瀸 3315 jian1 +瀹 3812 yue4yao4 +瀺 3711 chan2 +瀻 3315 dai4 +瀼 3013 rang2rang4 +瀽 3318 jian3 +瀾澜 3712 lan2 +瀿 3819 fan2 +灀 3116 shuang4 +灁 3712 yuan1 +灂 3214 zhuo2jiao4 +灃沣 3511 feng1 +灄滠 3114 she4ni4 +灅 3611 lei3 +灆 3411 lan2 +灇 3214 cong2 +灈 3611 qu2 +灉 3011 yong1 +灊 3112 qian2 +灋 3013 fa3 +灌 3411 guan4huan4 pour 2017 +灍 3712 que4 +灎 3411 yan4 +灏灝 3118 hao4 +灐 3911 ying2 +灑洒 3111 sa3 +灒 3418 zan4 +灓 2290 luan2 +灔 3711 yan4 +灕漓 3011 li2 +灖 3011 mi3 +灗 3011 shan4 +灘滩 3011 tan1 +灙 3913 dang3 +灚 3711 jiao3 +灛 3712 chan3 +灜 3011 ying2 +灝灏 3118 hao4 +灞 3112 ba4 +灟 3712 zhu2 +灠漤 3811 lan3 +灡㳕 3412 lan2 +灢 3013 nang3 +灣湾 3212 wan1 +灤滦 3219 luan2 +灥 2699 xun2 +灦 3118 xian3 +灧滟 3711 yan4 +灨 3718 gan4 +灩 3411 yan4 +灪 3412 yu4 +火 9080 huo3 u fire 388 +灬 3300 biao1hou3 +灭滅 1080 mie4 extinguish 1274 +灮 9021 guang1 +灯燈 9182 deng1 lamp 873 +灰 4080 hui1 grey 1277 +灱 9782 xiao1 +灲 9280 xiao1 +灳 2782 hui1 +灴 9181 hong2 +灵靈 1780 ling2 soul 629 +灶竈 3071 zao4 2759 +灷 9044 zhuan4 +灸 2780 jiu3 +灹 9281 zha4 +灺 9581 xie4 +灻 4080 chi4 +灼 9782 zhuo2 2644 +災灾 2280 zai1 +灾災 3080 zai1 1451 +灿燦 9287 can4 2213 +炀煬 9782 yang2 +炁 1033 qi4 +炂 9883 zhong1 +炃 8080 fen2 +炄 9781 niu3 +炅 6080 jiong3gui4 +炆 9084 wen2 +炇 9884 po4 +炈 9784 yi4 +炉爐 9382 lu2 stove 1808 +炊 9788 chui1 3433 +炋 9189 pi1 +炌 9882 kai4 +炍 9284 pan4 +炎 9080 yan2 1919 +炏 9988 kai4 +炐 9580 pang4 +炑 9489 mu4 +炒 9982 chao3 2694 +炓 9480 liao4 +炔 9588 que1 +炕 9081 kang4 2952 +炖燉 9581 dun4 +炗 4480 guang1 +炘 9282 xin1 +炙 2780 zhi4 3308 +炚 6908 guang1 +炛 9021 guang1 +炜煒 9582 wei3 3088 +炝熗 9881 qiang4 +炞 9083 bian1 +炟 9681 da2 +炠 9685 xia2 +炡 9181 zheng1 +炢 9389 zhu2 +炣 9182 ke3 +炤 9786 zhao4zhao1 +炥 9580 fu2 +炦 9384 ba2 +炧 9881 duo4xie4 +炨 9381 duo4 +炩 9882 ling4 +炪 9287 zhuo2 +炫 9083 xuan4 3338 +炬 9181 ju4 3038 +炭 2280 tan4 2419 +炮 9781 pao4bao1pao2 cannon 1729 +炯 9782 jiong3 2890 +炰 2733 pao2pao4 +炱 2380 tai2 +炲 9386 tai2 +炳 9182 bing3 3004 +炴 9588 yang3 +炵 9783 tong1 +炶 9186 han1 +炷 9081 zhu4 +炸 9881 zha4zha2 1758 +点點 2133 dian3 dot point 80 +為为 3432 wei2wei4 +炻 9186 shi2 +炼煉 9589 lian4 refine 1807 +炽熾 9688 chi4 flame 2966 +炾 9681 huang3 +炿 9284 zhou1 +烀 9284 hu1 +烁爍 9289 shuo4luo4 2450 +烂爛 9881 lan4 1741 +烃烴 9781 jing3ting1 +烄 9084 jiao3 +烅 9781 xu4 +烆 9182 xing2 +烇 9881 quan4quan3 +烈 1233 lie4 783 +烉 2780 huan4 +烊 9885 yang2yang4 +烋 2433 xiao1xiu1 +烌 9489 xiu1 +烍 9481 xian3 +烎 1080 yin2 +烏乌 2732 wu1wu4 +烐 9784 zhou1 +烑 9281 yao2 +烒 9385 shi4 +烓 9481 wei1 +烔 9782 tong2 +烕 5320 mie4 +烖 4385 zai1 +烗 9088 kai4 +烘 9488 hong1 2934 +烙 9786 luo4lao4 3394 +烚 9886 xia2 +烛燭 9583 zhu2 candle 2205 +烜 9181 xuan3 +烝 1733 zheng1 +烞 9380 po4 +烟煙 9680 yan1 781 +烠 9482 hui3 +烡 9080 guang1 +烢 9381 zhe4 +烣 9488 hui1 +烤 9482 kao3 roast 2563 +烥 9181 ju4 +烦煩 9188 fan2 1117 +烧燒 9581 shao1 burn 1150 +烨燁 9484 ye4 +烩燴 9883 hui4 +烪 9888 guan1 +烫燙 3780 tang4 2699 +烬燼 9783 jin4 3838 +热熱 5533 re4 hot 475 +烮 1280 lie4 +烯 9482 xi1 3993 +烰 9284 fu2 +烱 9782 jiong3 +烲 5280 che4 +烳 9382 pu3 +烴烃 9181 jing3ting1 +烵 9482 zhuo2 +烶 9284 ting3 +烷 9381 wan2 +烸 9885 hai3 +烹 0033 peng1 3260 +烺 9383 lang3 +烻 9284 yan4 +烼 9183 xu4 +烽 9785 feng1 3605 +烾 8010 chi4 +烿 9282 rong2 +焀 9886 hu2 +焁 6780 xi1 +焂 2880 shu2 +焃 9483 he4 +焄 1733 xun1hun1 +焅 9486 ku4 +焆 9682 jue2 +焇 9982 xiao1 +焈 3780 xi1yi2 +焉 1032 yan1yi2 2150 +焊 9684 han4 3939 +焋 2480 zhuang4 +焌 9384 jun4 +焍 9882 di4 +焎 5233 xie4 +焏 1733 ji2qi4 +焐 9186 wu4 +焑 9680 yan1 +焒 9686 lu3 +焓 9886 han2 +焔 9787 yan4 +焕煥 9788 huan4 2575 +焖燜 9782 men4 +焗 9782 ju2 +焘燾 5033 chou2tao1 +焙 9086 bei4 +焚 4480 fen2fen4 2610 +焛 7780 lin4 +焜 9681 kun1hun3 +焝 9286 hun4 +焞 9084 tun1 +焟 9186 xi2 +焠 9084 cui4 +無无 8033 wu2 +焢 9381 hong1 +焣 1733 ju4 +焤 0080 fu3 +焥 9381 wo4 +焦 2033 jiao1 1445 +焧 9883 cong1 +焨 9682 feng4 +焩 9782 ping1 +焪 9382 qiong1 +焫 9482 ruo4re4 +焬 9682 xi2 +焭 9921 qiong2 +焮 9788 xin4xin1 +焯 9184 zhuo2chao1 +焰 9787 yan4 2113 +焱 9088 yan4 +焲 9084 yi4 +焳 9081 jue2jiao1 +焴 9082 yu4 +焵 9782 gang4 +然 2333 ran2 70 +焷 9684 pi2 +焸 6680 gu3 +焹 9782 gang4 +焺 9684 sheng1 +焻 9686 chang4 +焼 9481 shao1 +焽 6780 xiong3ying1 +焾 9883 nian3 +焿 9088 geng1 +煀 9787 qu1 +煁 9481 chen2shen2 +煂 9485 he4 +煃 9481 kui3 +煄 9281 zhong1 +煅 9784 duan4 +煆 9784 xia1xia4 +煇 9785 hui1xun1yun4 +煈 9781 feng4 +煉炼 9589 lian4 +煊 9381 xuan1 +煋 9681 xing1 +煌 9681 huang2 2081 +煍 9988 jiao3 +煎 8033 jian1 2977 +煏 9186 bi4 +煐 9488 ying1 +煑 4080 zhu3 +煒炜 9585 wei3 +煓 9282 tuan1 +煔 9186 qian2shan1 +煕 7733 xi1 +煖 9284 nuan3xuan1 +煗 9188 nuan3 +煘 9385 chan2 +煙烟 9181 yan1 smoke +煚 6180 jiong3 +煛 6680 jiong3 +煜 9681 yu4 +煝 9786 mei4mei2 +煞 2833 sha1sha4 2480 +煟 9682 wei4 +煠 9489 ye4zha2 +煡 9584 xin4 +煢茕 9941 qiong2 +煣 9789 rou3 +煤 9489 mei2 coal 2177 +煥焕 9788 huan4 +煦 6733 xu4 3678 +照 6733 zhao4 399 +煨 9683 wei1yu4 +煩烦 9188 fan2 +煪 9886 qiu2 +煫 9883 sui4 +煬炀 9682 yang2 +煭 2233 lie4 +煮 4433 zhu3 boil 2670 +煯 9286 jie1 +煰 9686 gao4 +煱㶽 9782 gua1 +煲 2680 bao1bao4 +煳 9782 hu2 +煴熅 9681 yun1yun3 +煵 9482 xia1 +煶 9688 shi4 +煷 9081 huo3 +煸 9282 bian1 +煹 9584 gou4 +煺 9783 tui4 +煻 9086 tang2 +煼 9782 chao3 +煽 9382 shan1shan4 3569 +煾 9683 en1yun1 +煿 9384 bo2 +熀 9681 huang3 +熁 9482 xie2 +熂 9881 xi4 +熃 1780 wu4 +熄 9683 xi2xi1 2998 +熅煴 9681 yun1yun3 +熆 9481 he2 +熇 9082 he4 +熈 2733 xi1 +熉 9688 yun2 +熊 2233 xiong2 bear 1759 +熋 2280 nai2 +熌 9782 shan4 +熍 9386 qiong2 +熎 9287 yao4 +熏 2033 xun1xun4 2815 +熐 9788 mi4 +熑 9883 lian2 +熒荧 9980 ying2 +熓 9782 wu3wen4 +熔 9386 rong2 3405 +熕 9188 gong4 +熖 9287 yan4 +熗炝 9886 qiang4 +熘 9786 liu1liu4 +熙 7733 xi1yi2 2304 +熚 9605 bi4 +熛 9189 biao1 +熜 9603 zong3 +熝 9081 lu4 +熞 9701 jian1 +熟 0533 shu2shou2 cooked ripe 938 +熠 9786 yi4 3828 +熡 9584 lou2 +熢 9783 feng1 +熣 9281 sui1 +熤 9781 yi4 +熥 9783 tong1 +熦 9981 jue2 +熧 2880 zong1 +熨 7480 yun4yu4 +熩 9281 hu4 +熪 9782 yi2 +熫 9083 zhi4 +熬 5833 ao2ao1 2740 +熭 5580 wei4 +熮 9782 liao2 +熯 9408 han4 +熰 9181 ou1 +熱热 4533 re4 +熲颎 2188 jiong3 +熳 9684 man4 +熴 9281 kun1 +熵 9082 shang1 +熶 9684 cuan4 +熷 9886 zeng1 +熸 9186 jian1 +熹 4033 xi1 3871 +熺 9486 xi1 +熻 9882 xi1 +熼 9688 yi4 +熽 9582 xiao4 +熾炽 9385 chi4 +熿 9488 huang2 +燀 9685 chan3dan3 +燁烨 9485 ye4 +燂 9184 qian2xun2 +燃 9383 ran2 1697 +燄 2978 yan4 +燅 4918 xun2 +燆 9282 qiao2 +燇 9884 zun4 +燈灯 9281 deng1 +燉炖 9884 dun4 +燊 9090 shen1 +燋 9083 jiao1qiao2 +燌 9488 fen2ben4 +燍 9282 si1 +燎 9489 liao3liao2 3644 +燏 9782 yu4 +燐 9985 lin2 +燑 9081 tong2 +燒烧 9481 shao1 +燓 4480 fen1 +燔 9286 fan2fen2 +燕 4433 yan4yan1 1239 +燖 9784 xun2qian2 +燗 9782 lan4 +燘 9782 mei3 +燙烫 3680 tang4 +燚 9988 yi1 +燛 1180 jing3 +燜焖 9782 men4 +燝 9689 zhu3 +燞 2733 jiao3 +營营 9960 ying2 +燠 9788 yu4ao4 +燡 9684 yi4 +燢 7780 xue2 +燣 9089 lan2 +燤 9482 tai4 +燥 9689 zao4 2741 +燦灿 9789 can4 +燧 9883 sui4 +燨 9885 xi1 +燩 9884 que4 +燪 9483 cong1 +燫 9083 lian2 +燬 9784 hui3 +燭烛 9682 zhu2 +燮 9940 xie4 +燯 9183 ling2 +燰 9284 wei1 +燱 9083 yi4 +燲 9488 xie2 +燳 9783 zhao4 +燴烩 9886 hui4 +燵 9483 da2 +燶㶶 9583 nong2 +燷 9089 lan2 +燸 9182 ru2 +燹 1180 xian3 +燺 9089 kao3 +燻 9283 xun1 +燼烬 9581 jin4 +燽 9484 chou2 +燾焘 4033 tao1chou2 +燿 9781 yao4 +爀 9483 he4 +爁 9881 lan4 +爂 7780 biao1 +爃 9909 rong2 +爄 9182 li4 +爅 9681 mo4 +爆 9689 bao4 1719 +爇 4433 ruo4re4 +爈 9183 lv2 +爉 9281 la4lie4 +爊 9083 ao2ao1 +爋 9482 xun4xun1 +爌 9088 kuang4huang4 +爍烁 9289 shuo4luo4yue4 +爎 9389 liao2 +爏 9181 li4 +爐炉 9181 lu2 +爑 9483 jue2 +爒 2489 liao4 +爓 9782 yan4xun2 +爔 9885 xi1 +爕 9980 xie4 +爖 9181 long2 +爗 9685 ye4 +爘 9783 can1 +爙 9083 rang3 +爚 9882 yue4shuo4 +爛烂 9782 lan4 +爜 9284 cong2 +爝 9284 jue2jiao4 +爞 9503 chong2 +爟 9481 guan4 +爠 9681 qu2 +爡 9483 che4 +爢 0021 mi2 +爣 9983 tang3 +爤 9482 lan4 +爥 9782 zhu2 +爦 9881 lan3lan4 +爧 9181 ling2 +爨 7780 cuan4 +爩 9482 yu4 +爪 7223 zhua3zhao3 u claw 2594 +爫 2090 zhao3zhua3 +爬 7723 pa2 crawl climb 1655 +爭争 2050 zheng1 +爮 7723 pao2 +爯 2044 cheng1 +爰 2040 yuan2 +爱愛 2040 ai4 love 355 +爲为 2022 wei4wei2 +爳 2020 han +爴 6203 jue2 +爵 2074 jue2 2076 +父 8040 fu4fu3 u 499 +爷爺 8022 ye2 1011 +爸 8071 ba4 1552 +爹 8020 die1 1833 +爺爷 8012 ye2 +爻 4040 yao2xiao4 u +爼 4741 zu3 +爽 4080 shuang3 2101 +爾尔 1022 er3 +爿 2220 qiang2pan2 u +牀 2429 chuang2 +牁 2722 ge1 +牂 2825 zang1 +牃 2429 die2 +牄 2826 qiang1 +牅 2022 yong2 +牆墙 2426 qiang2 +片 2202 pian4pian1 u 413 +版 2204 ban3 1224 +牉 2905 pan4 +牊 2706 shao2 +牋 2305 jian1 +牌 2604 pai2 925 +牍牘 2408 du2 +牎 2703 chuang1cong1 +牏 2802 tou2yu2zhu4 +牐 2207 zha2 +牑 2302 bian1 +牒 2409 die2 +牓 2002 bang3 +牔 2304 bo2 +牕 2603 chuang1cong1 +牖 2702 you3 +牗 2002 you3yong1 +牘牍 2408 du2 +牙 1024 ya2 u 1067 +牚 9024 cheng4cheng1 +牛 2500 niu2 u bull 946 +牜 2500 niu2 +牝 2251 pin4 +牞 2452 jiu1 +牟 2350 mou2mu4 2681 +牠 2451 ta1 +牡 2451 mu3 2854 +牢 3050 lao2 1532 +牣 2752 ren4 +牤 2051 mang1 +牥 2052 fang1 +牦氂 2251 mao2 +牧 2854 mu4 1633 +牨 2051 gang1 +物 2752 wu4 254 +牪 2550 yan4 +牫 2355 ge1 +牬 2552 bei4 +牭 2650 si4 +牮 2350 jian4 +牯 2456 gu3 +牰 2556 you4chou1 +牱 2152 ge1 +牲 2551 sheng1 1745 +牳 2755 mu3 +牴 2254 di3 +牵牽 4050 qian1 drag 1550 +牶 9050 quan4 +牷 2851 quan2 +牸 2354 zi4 +特 2454 te4 263 +牺犧 2156 xi1suo1 sacrifice 2080 +牻 2351 mang2 +牼 2151 keng1 +牽牵 0050 qian1qian4 +牾 2156 wu2wu3 +牿 2456 gu4 +犀 7725 xi1 3304 +犁 2250 li2 plough 3473 +犂 2750 li2 +犃 2056 pou3 +犄 2452 ji1yi1 +犅 2752 gang1 +犆 2451 zhi2te4 +犇 2055 ben1 +犈 2951 quan2 +犉 2054 run2 +犊犢 2458 du2 3870 +犋 2758 ju4 +犌 2754 jia1 +犍 2554 jian1qian2jian3 +犎 4450 feng1 +犏 2352 pian1 +犐 2450 ke1 +犑 2658 ju2 +犒 2052 kao4 +犓 2752 chu2 +犔 2851 xi4 +犕 2452 bei4 +犖荦 9950 luo4 +犗 2356 jie4 +犘 0025 ma2 +犙 2352 san1 +犚 7450 wei4 +犛 5825 li2mao2 +犜 2854 dun1 +犝 2051 tong2 +犞 2252 qiao2 +犟 1650 jiang4 +犠 2855 xi1 +犡 2152 li4 +犢犊 2458 du2 +犣 2251 lie4 +犤 2651 pi2bei1 +犥 2053 piao3 +犦 2659 bao4bo2 +犧牺 2855 xi1suo1 +犨 2050 chou1 +犩 2650 wei4wei2 +犪 2854 kui2 +犫 2050 chou1 +犬 4380 quan3 u dog 2467 +犭 4020 quan3 +犮 4340 ba2 +犯 4721 fan4 872 +犰 4421 qiu2 +犱 4521 ji3 +犲 4420 cai2chai2 +犳 4722 chuo2 +犴 4124 an4han1 +犵 4821 ge1 +状狀 3318 zhuang4 698 +犷獷 4020 guang3 +犸獁 4722 ma4ma3 +犹猶 4321 you2 1197 +犺 4021 kang4 +犻 4022 bo2 +犼 4221 hou3 +犽 4124 ya2 +犾 4328 yin2 +犿 4423 huan1fan1 +狀状 2328 zhuang4 +狁 4321 yun3 +狂 4121 kuang2 1299 +狃 4721 niu3nv4 +狄 4928 di2ti4 2321 +狅 4221 qing1 +狆 4520 zhong4 +狇 4429 mu4 +狈狽 4728 bei4 3145 +狉 4121 pi1 +狊 6080 ju2 +狋 4129 yi2 +狌 4521 sheng1xing1 +狍 4721 pao2 +狎 4625 xia2 +狏 4821 tuo2 +狐 4223 hu2 2074 +狑 4822 ling2 +狒 4522 fei4 +狓 4424 pi1 +狔 4721 ni3 +狕 4422 ao3 +狖 4328 you4 +狗 4722 gou3 dog 1336 +狘 4325 yue4xue4 +狙 4721 ju1 +狚 4621 dan4 +狛 4620 po4 +狜 4426 gu3 +狝獮 4729 xian3 +狞獰 4322 ning2 3459 +狟 4121 huan2 +狠 4723 hen3 1514 +狡 4024 jiao3xiao4 2762 +狢 4726 he2 +狣 4221 zhao4 +狤 4426 ji2 +狥 4722 xun4xun2 +狦 4725 shan1 +狧 4226 ta4 +狨 4325 rong2 +狩 4324 shou4 3740 +狪 4722 tong1 +狫 4421 lao3 +独獨 4523 du2 alone 551 +狭狹 4528 xia2 2230 +狮獅 4122 shi1 lion 2225 +狯獪 4823 hua2kuai4 +狰猙 4725 zheng1 3836 +狱獄 4328 yu4 1868 +狲猻 4920 sun1 +狳 4829 yu2 +狴 4221 bi4 +狵 4321 mang2dou4 +狶 4422 xi3xi1 +狷 4622 juan4 +狸 4621 li2mai2 2816 +狹狭 4428 xia2 +狺 4026 yin2 +狻 4324 suan1 +狼 4323 lang2 wolf 1886 +狽狈 4628 bei4 +狾 4222 zhi4 +狿 4224 yan2 +猀 4922 sha1 +猁 4220 li4 +猂 4624 han4 +猃獫 4821 xian3 +猄 4029 jing1 +猅 4121 pai2 +猆 1180 fei1 +猇 4121 yao2xiao1 +猈 4624 ba4 +猉 4428 qi2 +猊 4721 ni2 +猋 4388 biao1 +猌 4398 yin4 +猍 4429 lai2 +猎獵 4426 lie4 hunt 1968 +猏 4322 jian1 +猐 4821 qiang1 +猑 4621 kun1 +猒 6328 yan1ya1yan4 +猓 4629 guo3luo3 +猔 4329 zong4 +猕獼 4729 mi2 +猖 4626 chang1 3369 +猗 4422 yi1yi3 +猘 4220 zhi4 +猙狰 4225 zheng1 +猚 4021 ya2 +猛 4721 meng3 1082 +猜 4522 cai1 1528 +猝 4024 cu4 3449 +猞 4826 she4she1 +猟 4921 lie4 +猠 4528 ceon +猡玀 4622 luo2 +猢 4722 hu2 +猣 4224 zong1 +猤 4228 ji4 +猥 4623 wei3wei4 +猦 4721 feng1 +猧 4722 wo1 +猨 4224 yuan2 +猩 4621 xing1 3400 +猪豬 4426 zhu1 pig swine hog 1885 +猫貓 4426 mao1miao2 cat 1839 +猬蝟 4622 wei4 +猭 4723 yuan2 +献獻 4328 xian4 1039 +猯 4222 tuan1 +猰 4728 ya4 +猱 4729 nao2 +猲 4622 xie1xie2he4 +猳 4724 jia1 +猴 4728 hou2 2338 +猵 4322 bian1 +猶犹 4826 you2yao2 +猷 8368 you2 +猸 4726 mei2 +猹 4421 zha1 +猺 4727 yao2 +猻狲 4229 sun1 +猼 4324 bo2po4 +猽 4728 ming2 +猾 4722 hua2 3372 +猿 4423 yuan2 2629 +獀 4724 sou1 +獁犸 4122 ma4ma3 +獂 4129 yuan2huan2 +獃 2318 dai1ai2 +獄狱 4328 yu4 +獅狮 4122 shi1 +獆 4614 hao2 +獇 4821 qiang1 +獈 4821 yi4 +獉 4529 zhen1 +獊 4826 chuang4cang1 +獋 4624 hao2 +獌 4624 man4 +獍 4021 jing4 +獎奖 2780 jiang3 +獏 4428 mu2mo4 +獐 4024 zhang1 +獑 4222 chan2 +獒 5880 ao2 +獓 4824 ao2 +獔 4624 hao2 +獕 4221 cui1 +獖 4528 fen2ben4 +獗 4128 jue2 3950 +獘 9780 bi4 +獙 4824 bi4 +獚 4428 huang2 +獛 4228 pu2 +獜 4925 lin2 +獝 4722 yu4xu4 +獞 4021 tong2 +獟 4421 yao4xiao1 +獠 4429 liao2lao3 +獡 4722 shuo4xi1que4 +獢 4222 xiao1 +獣 9368 shou4 +獤 4824 dun1 +獥 4824 xi2 +獦 4422 ge2 +獧 4623 juan4 +獨独 4622 du2 +獩 4125 hui4 +獪狯 4826 kuai4hua2 +獫猃 4828 xian3 +獬 4725 xie4ha3jie3 +獭獺 4728 ta4ta3 +獮狝 4122 xian3mi2 +獯 4223 xun1 +獰狞 4322 ning2 +獱㺍 4828 bian1pian4 +獲获 4424 huo4 +獳 4102 nou4 +獴 4423 meng2meng3 +獵猎 4221 lie4 +獶 4124 nao2 +獷犷 4028 guang3jing3 +獸兽 6368 shou4 +獹 4121 lu2 +獺獭 4728 ta3ta4 +獻献 2328 xian4suo1xi1 +獼猕 4122 mi2 +獽 4023 rang2 +獾 4421 huan1quan2 +獿 4124 nao2 +玀猡 4621 luo2e3 +玁 4624 xian3 +玂 4222 qi2 +玃 4624 jue2 +玄 0073 xuan2xuan4 u 1800 +玅 0972 miao4 +玆 0073 zi1 +率 0040 lv4shuai4 936 +玈 0873 lu2 +玉 1010 yu4 u 593 +玊 1010 su4 +王 1010 wang2wang4 242 +玌 1211 qiu2 +玍 8010 ga3 +玎 1112 ding1 +玏 1412 le4 +玐 1810 ba1 +玑璣 1711 ji1 +玒 1111 hong2 +玓 1712 di4 +玔 1210 chuan4quan4 +玕 1114 gan1 +玖 1718 jiu3 nine +玗 1114 yu2 +玘 1711 ji3qi3 +玙 1112 yu2 +玚瑒 1712 yang2chang4 +玛瑪 1712 ma3 2044 +玜 1813 gong1 +玝 1814 wu3 +玞 1518 fu1 +玟 1014 min2wen2 +玠 1812 jie4 +玡 1114 ya4 +玢 1812 bin1fen1 +玣 1313 bian4 +玤 1510 bang4beng3 +玥 1712 yue4 +玦 1518 jue2 +玧 1311 yun3 +玨 1111 jue2 +玩 1111 wan2wan4 play 958 +玪 1812 jian1 +玫 1814 mei2 2438 +玬 1714 dan3 +玭 1211 pin2 +玮瑋 1512 wei3 3833 +环環 1119 huan2 572 +现現 1711 xian4 89 +玱瑲 1811 qiang1 +玲 1813 ling2 1926 +玳 1314 dai4 +玴 1411 yi4 +玵 1417 an2 +玶 1114 ping2 +玷 1116 dian4dian1 3879 +玸 1711 fu2 +玹 1013 xuan2 +玺璽 2710 xi3 3548 +玻 1414 bo1 2030 +玼 1211 ci3ci1 +玽 1712 gou3 +玾 1615 jia3 +玿 1716 shao2 +珀 1610 po4 3427 +珁 1111 ci2 +珂 1112 ke1 3526 +珃 1514 ran3 +珄 1511 sheng1 +珅 1510 shen1 +珆 1316 yi2 +珇 1711 zu3 +珈 1610 jia1 +珉 1714 min2wen2 +珊 1714 shan1 2311 +珋 1712 liu3 +珌 1310 bi4 +珍 1812 zhen1 1199 +珎 1719 zhen1 +珏 1111 jue2 3802 +珐琺 1413 fa4 +珑瓏 1311 long2 3132 +珒 1510 jin1 +珓 1014 jiao4 +珔 1414 jian4 +珕 1412 li4 +珖 1911 guang1 +珗 1411 xian1 +珘 1714 zhou1 +珙 1418 gong3 +珚 1610 yan1 +珛 1412 xiu4 +珜 1815 yang2 +珝 1712 xu3 +珞 1716 luo4 +珟 1711 su4 +珠 1519 zhu1 1001 +珡 1180 qin2 +珢 1713 ken4 +珣 1712 xun2 +珤 1817 bao3 +珥 1114 er3 +珦 1712 xiang4 +珧 1211 yao2 +珨 1816 xia2 +珩 1112 heng2 +珪 1411 gui1 +珫 1011 chong1 +珬 1315 xu4 +班 1111 ban1 829 +珮 1711 pei4 +珯 1411 lao3 +珰璫 1917 dang1 +珱 1914 ying1 +珲琿 1715 hun2hui1 +珳 1214 wen2 +珴 1315 e2 +珵 1611 cheng2 +珶 1812 di4ti2 +珷 1314 wu3 +珸 1116 wu2 +珹 1315 cheng2 +珺 1716 jun4 +珻 1815 mei2 +珼 1618 bei4 +珽 1214 ting3 +現现 1611 xian4 +珿 1618 chuo4 +琀 1816 han2han4 +琁 1818 xuan2 +琂 1016 yan2 +球 1319 qiu2 ball 962 +琄 1612 quan3juan1xuan4 +琅 1313 lang2lang4 3245 +理 1611 li3 98 +琇 1212 xiu4 +琈 1214 fu2 +琉 1011 liu2 3187 +琊 1712 ye2ya2 +琋 1412 xi1 +琌 1212 ling2 +琍 1210 li4li2 +琎 1413 jin4jin1 +琏璉 1413 lian2 +琐瑣 1918 suo3 2521 +琑 1912 suo3 +琒 1715 feng1 +琓 1311 wan2 +琔 1318 dian4 +琕 1614 pin2bing3 +琖 1315 zhan3 +琗 1014 cui4 +琘 1216 min2 +琙 1815 yu4 +琚 1716 ju1 +琛 1719 chen1 2914 +琜 1419 lai2 +琝 1614 wen2 +琞 6710 sheng4wang4 +琟 1011 wei2 +琠 1518 dian3 +琡 1714 chu4 +琢 1113 zhuo2zuo2 2820 +琣 1016 pei3 +琤 1215 cheng1 +琥 1111 hu3 3827 +琦 1412 qi2 2852 +琧 1010 e4 +琨 1611 kun1 3815 +琩 1616 chang1 +琪 1418 qi2 2323 +琫 1515 beng3 +琬 1311 wan3 +琭 1719 lu4 +琮 1319 cong2 +琯 1317 guan3 +琰 1918 yan3 +琱 1712 diao1 +琲 1111 bei4 +琳 1419 lin2 2025 +琴 1120 qin2 1345 +琵 1171 pi2 3244 +琶 1171 pa2 3263 +琷 1811 que4 +琸 1114 zhuo2 +琹 1190 qin2 +琺珐 1413 fa4 +琻 1811 jin1 +琼瓊 1019 qiong2 2137 +琽 1416 du3 +琾 1612 jie4 +琿珲 1715 hun2hui1 +瑀 1212 yu3 +瑁 1616 mao4mei4 +瑂 1716 mei2 +瑃 1516 chun1 +瑄 1311 xuan1 +瑅 1618 ti2 +瑆 1611 xing1 +瑇 1515 dai4 +瑈 1719 rou2 +瑉 1716 min2 +瑊 1315 zhen1jian1 +瑋玮 1415 wei3 +瑌 1118 ruan3 +瑍 1718 huan4 +瑎 1216 jie1 +瑏 1314 chuan1 +瑐 1812 jian3 +瑑 1713 zhuan4 +瑒玚 1612 yang2chang4 +瑓 1519 lian4 +瑔 1619 quan2 +瑕 1714 xia2 3629 +瑖 1714 duan4 +瑗 1214 yuan4huan2 +瑘 1712 ye2 +瑙 1216 nao3 3914 +瑚 1712 hu2 3292 +瑛 1418 ying1 3347 +瑜 1812 yu2 2932 +瑝 1611 huang2 +瑞 1212 rui4 1178 +瑟 1133 se4 2224 +瑠 1716 liu2 +瑡 1112 shi1 +瑢 1316 rong2 +瑣琐 1918 suo3 +瑤瑶 1717 yao2 +瑥 1611 wen1 +瑦 1712 wu1 +瑧 1519 jin1 +瑨 1116 jin4 +瑩莹 9910 ying2ying3 +瑪玛 1112 ma3 +瑫 1217 tao1 +瑬 1010 liu2 +瑭 1016 tang2 +瑮 1119 li4 +瑯 1712 lang2 +瑰 1611 gui1 2215 +瑱 1418 tian4zhen4 +瑲玱 1816 qiang1 +瑳 1811 cuo3cuo1 +瑴 4714 jue2 +瑵 1711 zhao3 +瑶瑤 1717 yao2 2556 +瑷璦 1214 ai4 +瑸 1318 bin1pian2 +瑹 1419 tu2 +瑺 1912 chang2 +瑻 1718 kun1 +瑼 1514 zhuan1 +瑽 1818 cong1 +瑾 1411 jin3jin4 3339 +瑿 7710 yi1 +璀 1211 cui3 3851 +璁 1613 cong1 +璂 1411 qi2 +璃 1012 li2li5 1933 +璄 1011 ying3 +璅 1219 suo3 +璆 1712 qiu2 +璇 1818 xuan2 3011 +璈 1814 ao2 +璉琏 1513 lian2 +璊 1412 men2man2 +璋 1014 zhang1 3461 +璌 1318 yin2 +璍 1415 ye4 +璎瓔 1714 ying1 +璏 1711 zhi4 +璐 1716 lu4 3688 +璑 1813 wu2 +璒 1711 deng1 +璓 1412 xiu4 +璔 1816 zeng1 +璕 1714 xun2 +璖 1119 qu2 +璗 3610 dang4 +璘 1915 lin2 +璙 1419 liao2 +璚 1712 qiong2jue2 +璛 1512 su4 +璜 1418 huang2 3981 +璝 1518 gui1 +璞 1218 pu2 3469 +璟 1619 jing3 +璠 1216 fan2 +璡 1013 jin4jin1 +璢 1116 liu2 +璣玑 1215 ji1 +璤 1513 hui4 +璥 1814 jing3 +璦瑷 1214 ai4 +璧 7010 bi4 3046 +璨 1719 can4 3967 +璩 1113 qu2 +璪 1619 zao3 +璫珰 1916 dang1 +璬 1814 jiao3 +璭 1713 gun4 +璮 1011 tan3 +璯㻅 1816 hui4 +環环 1613 huan2 +璱 1113 se4 +璲 1813 sui4 +璳 1518 tian2 +璴 1418 chu3 +璵 1718 yu2 +璶 1511 jin4 +璷 1814 lu2 +璸 1318 bin1 +璹 1414 shu2 +璺 7710 wen4 +璻 1714 zui3 +璼 1811 lan2 +璽玺 1010 xi3 +璾 1012 ji4 +璿 1116 xuan2 +瓀 1112 ruan3 +瓁 1414 huo4 +瓂 1411 gai4 +瓃 1616 lei2 +瓄 1418 du2 +瓅 1219 li4 +瓆 1218 zhi2 +瓇 1114 rou2 +瓈 1719 li2 +瓉 1518 zan4 +瓊琼 1714 qiong2xuan2 +瓋 1013 zhe2 +瓌 1013 gui1 +瓍 1413 sui4 +瓎 1718 la4 +瓏珑 1111 long2 +瓐 1111 lu2 +瓑 1111 li4 +瓒瓚 1418 zan4 +瓓 1712 lan4 +瓔璎 1614 ying1 +瓕 1110 mi2 +瓖 1013 xiang1 +瓗 1212 xi1 +瓘 1411 guan4 +瓙 1414 dao4 +瓚瓒 1418 zan4 +瓛 1318 huan2 +瓜 7223 gua1 u 1730 +瓝 7723 bo2 +瓞 7523 die2 +瓟 7723 bao2bo2 +瓠 4223 hu4hu2huo4gu1 +瓡 4243 zhi2 +瓢 1293 piao2 3404 +瓣 0044 ban4 2555 +瓤 0271 rang2 +瓥 7113 li4 +瓦 1071 wa3wa4 u 1328 +瓧 1471 shi2wa3 +瓨 1111 jiang1hong2 +瓩 1271 qian1wa3 +瓪 1271 ban3 +瓫 8071 pen2 +瓬 0121 fang3 +瓭 4101 dan3 +瓮 8071 weng4 jar 3809 +瓯甌 7171 ou1 +瓰 1871 fen1wa3 +瓱 1271 mao2wa3 +瓲 1571 tun2wa3 +瓳 4161 hu2 +瓴 8121 ling2 +瓵 2161 yi2 +瓶 8141 ping2 jar bottle 1462 +瓷 3771 ci2 2578 +瓸 1171 bai3wa3 +瓹 6121 juan4 +瓺 7171 chang2 +瓻 4121 chi1 +瓼 1671 li3wa3 +瓽 9071 dang4 +瓾 2141 meng3 +瓿 0161 pou3bu4 +甀 2111 zhui4 +甁 2141 ping2 +甂 7121 bian1 +甃 2971 zhou4 +甄 1111 zhen2 3417 +甅 1171 li2wa3 +甆 8071 ci2 +甇 9971 ying1 +甈 2191 qi4 +甉 8121 xian2 +甊 5141 lou3 +甋 0121 di4 +甌瓯 7171 ou1ou3 +甍 4471 meng2 +甎 5131 zhuan1 +甏 4271 peng4beng4 +甐 9121 lin2 +甑 8161 zeng4 +甒 8131 wu3 +甓 7071 pi4 +甔 2161 dan1 +甕 0071 weng4 +甖 6671 ying1 +甗 2121 yan3 +甘 4477 gan1 u 1370 +甙 4370 dai4 +甚 4471 shen2shen4 528 +甛 4276 tian2 +甜 2467 tian2 sweet 1712 +甝 2421 han1han2 +甞 9077 chang2 +生 2510 sheng1 u 29 +甠 6501 qing2 +甡 2511 shen1sheng1 +產产 0021 chan3 +産产 0021 chan3 +甤 1523 rui2 +甥 2612 sheng1 3453 +甦 1550 su1 +甧 2522 sen1 +用 7722 yong4 u use 44 +甩 7721 shuai3 2526 +甪 2722 lu4 +甫 5322 fu3pu4pu3 1925 +甬 1722 yong3dong4 3780 +甭 1022 beng2qi4 3795 +甮 2722 feng4 +甯 3022 ning2ning4 +田 6040 tian2 u 864 +由 5060 you2yao1 from 148 +甲 6050 jia3 1286 +申 5000 shen1 1220 +甴 4060 zha2 +电電 5071 dian4 electricity 313 +甶 2600 fu2 +男 6042 nan2 male 555 +甸 2762 dian4tian2sheng4 2624 +甹 5002 ping2ping1 +町 6102 ting3ding1 +画畫 1077 hua4 603 +甼 6020 ting3 +甽 6200 quan3zhen4 +甾 2260 zi1zai1 +甿 6001 meng2 +畀 6022 bi4 +畁 5022 qi2bi4 +畂 6708 liu4jiu4mu3 +畃 5702 xun2 +畄 9060 liu2 +畅暢 5702 chang4 1858 +畆 0263 mu3 +畇 6702 yun2 +畈 6204 fan4 +畉 6508 fu2 +畊 6500 geng1 +畋 6804 tian2 +界 6022 jie4 421 +畍 6802 jie4 +畎 6308 quan3 +畏 6073 wei4wei1wei3 2021 +畐 1060 fu2 +畑 9680 tian2 +畒 0860 mu3 +畓 9060 duo1 +畔 6905 pan4 2496 +畕 6060 jiang1 +畖 6203 wa1 +畗 0060 da2fu2 +畘 6504 nan2 +留 7760 liu2 442 +畚 2360 ben3 +畛 6802 zhen3 +畜 0060 chu4xu4 2154 +畝亩 0768 mu3 +畞 4068 mu3 +畟 6040 ce4 +畠 2660 zai1zi1 +畡 6008 gai1 +畢毕 6050 bi4 +畣 8060 da2 +畤 6404 zhi4 +略 6706 lue4 748 +畦 6401 qi2xi2 +畧 6060 lue4 +畨 9060 pan1fan1 +畩 6003 yi1 +番 2060 fan1pan1 1191 +畫划 5010 hua4 draw +畬 6809 yu2she1 +畭 6809 yu2 +畮 6805 mu3 +畯 6304 jun4 +異异 6080 yi4 +畱 1060 liu2liu3 +畲 8060 yu2she1 +畳 6010 die2 +畴疇 6504 chou2 3102 +畵 5077 hua4 +當当 9060 dang1dang4 +畷 6704 chuo4zhuo2 +畸 6402 ji1qi2 3577 +畹 6301 wan3yuan4 +畺 1010 jiang1 +畻 6901 sheng2 +畼 6602 chang4 +畽 6201 tuan3 +畾 6066 lei2 +畿 2265 ji1 +疀 2568 cha1 +疁 6702 liu2 +疂 6010 die2 +疃 6001 tuan3 +疄 6905 lin2 +疅 6101 jiang1 +疆 1111 jiang1qiang2 2041 +疇畴 6404 chou2 +疈 1166 bo4pi4 +疉 6010 die2 +疊叠 6010 die2 +疋 1780 pi3pi1shu1ya3 u +疌 5080 nie4 +疍 1710 dan4 +疎 1519 shu1shu4 +疏 1011 shu1shu4 1571 +疐 4080 zhi4di4 +疑 2788 yi2ni3 674 +疒 0010 chuang2 u +疓 0012 nai3 +疔 0012 ding1ne4 +疕 0011 bi3 +疖癤 0012 jie2 +疗療 0012 liao2 1654 +疘 0011 gang1gong1 +疙 0011 ge1yi4 3499 +疚 0018 jiu4 3248 +疛 0014 zhou3 +疜 0013 xia4 +疝 0017 shan4 +疞 0012 xu1 +疟瘧 0011 nue4yao4 malaria +疠癘 0012 li4 +疡瘍 0012 yang2 +疢 0018 chen4 +疣 0011 you2you4 +疤 0011 ba1 3264 +疥 0012 jie4 +疦 0018 jue2 +疧 0014 zhi1 +疨 0014 xia1 +疩 0014 cui4 +疪 0011 bi4 +疫 0014 yi4 2537 +疬癧 0012 li4 +疭瘲 0018 zong4 +疮瘡 0011 chuang1 3063 +疯瘋 0011 feng1 1652 +疰 0011 zhu4 +疱皰 0011 pao4 +疲 0014 pi2 1945 +疳 0017 gan1 +疴痾 0012 ke1e1qia4 +疵 0011 ci1zi1zhai4ji4 3992 +疶 0011 xie4 +疷 0014 qi2 +疸 0011 dan3dan4da5 +疹 0012 zhen3chen4 +疺 0013 fa2 +疻 0018 zhi3 +疼 0013 teng2 1343 +疽 0011 ju1ju3 +疾 0018 ji2 1283 +疿 0012 fei4fei2 +痀 0012 qu2gou1ju1yu3 +痁 0016 dian4shan1 +痂 0016 jia1 +痃 0013 xian2 +痄 0011 zha4cha2zha3 +病 0012 bing4 ill 476 +痆 0011 ni4na4 +症癥 0011 zheng4zheng1 2046 +痈癰 0012 yong1 +痉痙 0011 jing4 +痊 0011 quan2 3557 +痋 0013 chong2 +痌 0012 tong1 +痍 0018 yi2 +痎 0018 kai1lie1 +痏 0012 wei3 +痐 0016 hui2 +痑 0012 duo3 +痒癢 0015 yang3yang2 2859 +痓 0011 chi4 +痔 0014 zhi4 +痕 0013 hen2gen4 1783 +痖瘂 0011 ya3 +痗 0015 mei4 +痘 0011 dou4 +痙痉 0011 jing4 +痚 0014 xiao1 +痛 0012 tong4 806 +痜 0011 tu1 +痝 0011 mang2 +痞 0016 pi3 3991 +痟 0012 xiao1 +痠 0014 suan1 +痡 0012 pu1 +痢 0012 li4 +痣 0013 zhi4 +痤 0011 cuo2 +痥 0011 duo2 +痦 0016 wu4pi1 +痧 0012 sha1 +痨癆 0012 lao2 +痩 0014 shou4 +痪瘓 0018 huan4 3531 +痫癇 0012 xian2 +痬 0012 yi4 +痭 0012 peng2 +痮 0013 zhang4 +痯 0017 guan3 +痰 0018 tan2 3662 +痱 0011 fei4fei2fei3 +痲 0011 ma2 +痳 0019 lin2 +痴 0016 chi1 1771 +痵 0014 ji4 +痶 0018 dian3 +痷 0021 an1 +痸 0012 chi4 +痹 0012 bi4 3796 +痺 0014 bi4bei1 +痻 0016 min2 +痼 0016 gu4gu1 +痽 0011 dui1 +痾疴 0012 e1ke1 +痿 0014 wei3 +瘀 0013 yu1 +瘁 0014 cui4 +瘂痖 0011 ya3 +瘃 0013 zhu2zhu3 +瘄 0016 cu4 +瘅癉 0015 dan4dan1 +瘆瘮 0012 shen4 +瘇 0011 zhong3 +瘈 0018 chi4zhi4 +瘉 0012 yu4 +瘊 0018 hou2 +瘋疯 0011 feng1 +瘌 0012 la4 +瘍疡 0012 yang2 +瘎 0011 shen4 +瘏 0016 tu2 +瘐 3018 yu3 +瘑 0012 gua1 +瘒 0015 wen2 +瘓痪 0018 huan4 +瘔 0016 ku4 +瘕 0014 jia3xia2xia1 +瘖 0016 yin1 +瘗瘞 0011 yi4 +瘘瘺 0014 lv2lou4 +瘙 0013 sao1sao4 +瘚 0018 jue2 +瘛 0013 chi4 +瘜 0013 xi2 +瘝 0019 guan1 +瘞瘗 0011 yi4 +瘟 0011 wen1wo4yun1 3524 +瘠 0012 ji2zi4 3974 +瘡疮 0016 chuang1 +瘢 0014 ban1 +瘣 0011 lei3 +瘤 0016 liu2 3136 +瘥 0011 chai4cuo2 +瘦 0014 shou4 thin 1733 +瘧疟 0011 nue4yao4 +瘨 0018 dian1 +瘩 0016 da5da1da2 3447 +瘪癟 0011 pie1bie3bie1 3900 +瘫癱 0011 tan1 2853 +瘬 0013 zhang4 +瘭 0019 biao1 +瘮瘆 0012 shen4 +瘯 0018 cu4 +瘰 0019 luo3 +瘱 0013 yi4 +瘲疭 0018 zong4 +瘳 0012 chou1lu4 +瘴 0014 zhang4 3903 +瘵 0019 zhai4ji4 +瘶 0018 sou4 +瘷 0014 suo3 +瘸 0012 que2 3579 +瘹 0012 diao4 +瘺瘘 0012 lou4 +瘻瘘 0014 lv2lou4 +瘼 0018 mo4 +瘽 0011 jin4 +瘾癮 0013 yin3 habit 3061 +瘿癭 0014 ying3 +癀 0018 huang2 +癁 0014 fu2 +療疗 0019 liao2shuo4 +癃 0011 long2 +癄 0013 qiao2 +癅 0016 liu2 +癆痨 0012 lao2lao4 +癇痫 0012 xian2 +癈 0014 fei4 +癉瘅 0014 dan4dan1 +癊 0013 yin4 +癋 0013 he4 +癌 0017 ai2yan2 cancel 3412 +癍 0011 ban1 +癎 0012 xian2 +癏 0013 guan1 +癐 0016 guai4 +癑 0013 nong2 +癒 0013 yu4 +癓 0014 wei2 +癔 0013 yi4 +癕 0011 yong1 +癖 0014 pi3 3814 +癗 0016 lei3 +癘疠 0012 li4 +癙 0011 shu3 +癚 0016 dan4 +癛 0019 lin3bing3 +癜 0014 dian4 +癝 0019 lin3bing3 +癞癩 0018 lai4la4 3998 +癟瘪 0012 bie3pie1bie1 +癠 0012 ji4ji2 +癡 0018 chi1 +癢痒 0013 yang3 +癣癬 0015 xian3xuan3 +癤疖 0012 jie2 +癥症 0014 zheng1 +癦 0011 mo4 +癧疬 0011 li4 +癨 0011 huo4 +癩癞 0018 lai4la4 +癪 0018 ji1 +癫癲 0018 dian1 3654 +癬癣 0015 xuan3xian3 +癭瘿 0014 ying3 +癮瘾 0013 yin3 +癯 0011 qu2 +癰痈 0011 yong1 +癱瘫 0011 tan1 +癲癫 0018 dian1 +癳 0019 luo3 +癴 0015 luan2 +癵 0012 luan2 +癶 1223 bo1 u +癷 1240 bo1 +癸 1280 gui3 +癹 1240 po1ba2 +発 1241 fa1fa4 +登 1210 deng1de2 mount 835 +發发 1224 fa1fa4 +白 2600 bai2 u white 278 +百 1060 bai3 hundred 325 +癿 2261 qie2 +皀 2671 bi1ji2 +皁 2640 zao4 +皂 2671 zao4 3039 +皃 2621 mao4 +的 2762 de5 1 +皅 2761 pa1 +皆 2260 jie1 1290 +皇 2610 huang2 1037 +皈 2264 gui1 +皉 2261 ci3 +皊 2862 ling2 +皋 2640 gao1hao2 3376 +皌 2569 mo4 +皍 2672 ji2 +皎 2064 jiao3 3667 +皏 2864 peng3 +皐 2640 gao1 +皑皚 2261 ai2 +皒 2365 e2 +皓 2466 hao4hui1 2958 +皔 2664 han4 +皕 1166 bi1 +皖 2361 wan3huan4 3875 +皗 2762 chou2 +皘 2562 qian4 +皙 4260 xi1 +皚皑 2261 ai2 +皛 2666 xiao3 +皜 2062 hao4gao3 +皝 2911 huang3 +皞 2665 hao4 +皟 2568 ze2 +皠 2261 cui3cui4 +皡 2664 hao4 +皢 2461 xiao3 +皣 2465 ye4 +皤 2266 po2 +皥 2664 hao4 +皦 2864 jiao3 +皧 2264 ai4 +皨 2610 xing1 +皩 2611 huang4 +皪 2269 li4 +皫 2063 piao3 +皬 2161 he4he2 +皭 2264 jiao4 +皮 4024 pi2 u leather 766 +皯 4124 gan3 +皰疱 4721 pao4 +皱皺 2414 zhou4 2020 +皲皸 3454 jun1 +皳 4494 qiu2 +皴 2444 cun1 +皵 4464 que4 +皶 4414 zha1 +皷 4414 gu3 +皸皲 3454 jun1 +皹 4725 jun1 +皺皱 2444 zhou4 +皻 2424 zha1 +皼 4414 gu3 +皽 0414 zhan3 +皾 4484 du2 +皿 7710 min3 u 3758 +盀 2310 qi3 +盁 1710 ying2 +盂 1010 yu2 3840 +盃 1010 bei1 cup +盄 1710 diao4 +盅 5010 zhong1 3702 +盆 8010 pen2 2042 +盇 4010 he2 +盈 1710 ying2 1635 +盉 2010 he2 +益 8010 yi4 848 +盋 4310 bo1 +盌 2710 wan3 +盍 4010 he2ke3 +盎 5010 ang4 3620 +盏盞 5310 zhan3 2660 +盐鹽 4310 yan2 salt 2110 +监監 2810 jian1jian4 930 +盒 8010 he2an1 box 1742 +盓 3110 yu1 +盔 4010 kui1 3177 +盕 3710 fan4 +盖蓋 8010 gai4ge3he2 lid cap 879 +盗盜 3710 dao4 1429 +盘盤 2710 pan2 758 +盙 5310 fu3 +盚 4310 qiu2 +盛 5310 sheng4cheng2 1070 +盜盗 3710 dao4 +盝 2710 lu4 +盞盏 5310 zhan3 +盟 6710 meng2 1503 +盠 2710 li3 +盡尽 5010 jin4jin3 +盢 6310 xu4 +監监 7810 jian1jian4 +盤盘 2710 pan2 +盥 7710 guan4 +盦 8010 an1 +盧卢 2121 lu2 +盨 2110 shu3xu3 +盩 4810 zhou1chou1 +盪荡 3610 dang4 +盫 8010 an1 +盬 7810 gu3 +盭 2810 li4 +目 6010 mu4 u 185 +盯 6102 ding1 2121 +盰 6104 gan3 +盱 6104 xu1 +盲 0060 mang2 blind 2197 +盳 6001 mang2 +直 4071 zhi2 straight 222 +盵 6801 qi4 +盶 6101 ruan3 +盷 6702 tian2 +相 4690 xiang1xiang4 117 +盹 6501 dun3 +盺 6202 xin1 +盻 6802 xi4 +盼 6802 pan4 1944 +盽 6500 feng1 +盾 7226 dun4 1766 +盿 6004 min2 +眀 6702 ming2 +省 9060 sheng3xing3 province 691 +眂 6204 shi4 +眃 6103 yun2 +眄 6102 mian3 +眅 6104 pan1 +眆 6002 fang3 +眇 6902 miao3miao4 +眈 6401 dan1 +眉 7726 mei2 1149 +眊 6201 mao4 +看 2060 kan4kan1 look 102 +県 2690 xian4 +眍瞘 6101 ou1 +眎 6109 shi4 +眏 6508 yang1 +眐 6101 zheng1 +眑 6402 yao3 +眒 6500 shen4 +眓 6305 huo4 +眔 6090 da4 +眕 6802 zhen3 +眖 6601 kuang4 +眗 6702 ju1 +眘 4060 shen4 +眙 6306 chi4yi2 +眚 2560 sheng3 +眛 6509 mei4 +眜 6509 mo4mie4 +眝 6302 zhu4 +眞 2280 zhen1 +真 4080 zhen1 true 160 +眠 6704 mian2 2061 +眡 6204 shi4 +眢 2760 yuan1 +眣 6508 die2 +眤 6701 yi2 +眥眦 2260 zi4 +眦眥 6201 zi4 +眧 6706 chao3 +眨 6203 zha3 2752 +眩 6003 xuan4 3135 +眪 6102 bing3 +眫 6905 mi3 +眬矓 6301 long2 +眭 6401 gui4sui1 +眮 6702 dong4 +眯 6909 mi1 3037 +眰 6101 die2 +眱 6508 yi2 +眲 6104 er4ne4 +眳 6706 ming2 +眴 6702 xuan4shun4 +眵 6702 chi1 +眶 6101 kuang4 2987 +眷 9060 juan4 2488 +眸 6305 mou2 2411 +眹 6808 zhen4 +眺 6201 tiao4 3096 +眻 6805 yang2 +眼 6703 yan3 315 +眽 6203 mo4 +眾众 6088 zhong4 +眿 6309 mai4 +着著 8060 zhuo2 64 +睁睜 6705 zheng1 1900 +睂 8226 mei2 +睃 6304 jun4 +睄 6902 shao4 +睅 6604 han4 +睆 6301 huan3 +睇 6802 di4ti1 +睈 6601 cheng3 +睉 6801 cuo1 +睊 6602 juan4 +睋 6305 e2 +睌 6701 wan3 +睍 6601 xian4 +睎 6402 xi1 +睏困 6600 kun4 +睐睞 6509 lai4 3602 +睑瞼 6801 jian3 eyelid +睒 6908 shan3 +睓 6508 tian3 +睔 6802 hun3gun3 +睕 6301 wan3wan1 +睖 6404 ling2leng4 +睗 6602 shi4 +睘 6073 qiong2 +睙 6308 lie4 +睚 6101 yai2ya2 +睛 6502 jing1jing3 979 +睜睁 6205 zheng1 +睝 2760 li2 +睞睐 6409 lai4 +睟 6004 sui4 +睠 6901 juan4 +睡 6201 shui4 sleep 911 +睢 6001 sui1 +督 2760 du1 1364 +睤 6602 bi4 +睥 6604 bi4pi4 +睦 6401 mu4 3056 +睧 6206 hun1 +睨 6701 ni4 +睩 6709 lu4 +睪 2640 yi4gao1ze2 +睫 6508 jie2she4 3114 +睬 6209 cai3 3310 +睭 6702 zhou3 +睮 6802 yu2 +睯 7860 hun1 +睰 6406 ma4 +睱 6704 xia4jia3 +睲 6601 xing3 +睳 6401 xi1 +睴 6705 gun4 +睵 6305 zai1 +睶 6506 chun3 +睷 6504 jian1 +睸 6706 mei4 +睹 6406 du3 2346 +睺 6708 hou2 +睻 6301 xuan1 +睼 6608 ti4 +睽 6208 kui2 3959 +睾 2640 gao1 testicle +睿 2160 rui4 3275 +瞀 1860 mao4 +瞁 6608 xu4 +瞂 7324 fa2 +瞃 6206 wen1 +瞄 6406 miao2 2867 +瞅 6908 chou3 3027 +瞆瞶 6508 gui4kui4 +瞇 6903 mi1 +瞈 6802 weng3 +瞉 4764 kou4 +瞊 6006 dang4 +瞋 6408 chen1 +瞌 6401 ke1 +瞍 6704 sou3 +瞎 6306 xia1 blind 2549 +瞏 6073 qiong2 +瞐 6066 mao4 +瞑 6708 ming2 +瞒瞞 6402 man2men2 2320 +瞓 6200 shui4 +瞔 6508 ze2 +瞕 6004 zhang4 +瞖 7760 yi4 +瞗 6702 diao1 +瞘眍 6101 ou1 +瞙 6408 mo4 +瞚 6008 shun4 +瞛 6868 cong1 +瞜䁖 6504 lou1 +瞝 6002 chi1 +瞞瞒 6402 man2men2 +瞟 6109 piao3piao4piao1 3868 +瞠 6901 cheng1zheng4 +瞡 6601 ji4 +瞢 4460 meng2meng4mang2 +瞣 6503 wan4 +瞤 6702 run2 +瞥 9860 pie1bi4 2649 +瞦 6406 xi1 +瞧 6003 qiao2 look 1284 +瞨 6208 pu2 +瞩矚 6702 zhu3 3062 +瞪 6201 deng4 2149 +瞫 6104 shen3 +瞬 6205 shun4 1978 +瞭 6409 liao3liao4yao3 +瞮 6804 che4 +瞯 6702 xian2jian4 +瞰 6804 kan4 3935 +瞱 6405 ye4 +瞲 6702 xu4xue4 +瞳 6001 tong2 3220 +瞴 6803 mou2 +瞵 6905 lin2lin4lian2 +瞶瞆 6508 kui4gui4 +瞷 6702 xian2jian4 +瞸 6409 ye4 +瞹 6204 ai4 +瞺 6806 hui4 +瞻 6706 zhan1 2633 +瞼睑 6808 jian3 +瞽 4460 gu3 +瞾 6610 zhao4 +瞿 6621 qu2ju4 3225 +矀 6804 wei2 +矁 6903 chou3 +矂 6609 sao4 +矃 6302 ning3 +矄 6203 xun1 +矅 6701 yao4 +矆 6404 huo4xue1 +矇 6403 meng2 +矈 6602 mian2 +矉 6308 bin1pin2 +矊 6602 mian2 +矋 6102 li4 +矌 6008 kuang4 +矍 6640 jue2 +矎 6704 xuan1 +矏 6602 mian2 +矐 6101 huo4 +矑 6101 lu2 +矒 6406 meng2meng3 +矓眬 6101 long2 +矔 6401 guan4 +矕 2260 man3 +矖 6101 xi3 +矗 4071 chu4 3446 +矘 6903 tang3 +矙 6707 kan4 +矚瞩 6702 zhu3 +矛 1722 mao2 u arrow 1692 +矜 1822 jin1guan1qin2 3508 +矝 7823 lin2 +矞 2022 yu4jue2xu4 +矟 1922 shuo4 +矠 1426 ce4 +矡 1624 jue2 +矢 8080 shi3 u 2147 +矣 2380 yi3 1891 +矤 1828 shen3 +知 8680 zhi1zhi4 120 +矦 2728 hou2 +矧 8280 shen3 +矨 8288 ying3 +矩 8181 ju3 1883 +矪 8784 zhou1 +矫矯 8282 jiao3jiao2 2866 +矬 8881 cuo2 +短 8181 duan3 short 786 +矮 8284 ai3 2297 +矯矫 8282 jiao3jiao1 +矰 8886 zeng1 +矱 2484 huo4yue1 +矲 8681 bai3 +石 1060 shi2dan4 u stone 404 +矴 1162 ding4 +矵 1260 qi4diao1 +矶磯 1761 ji1 3515 +矷 1764 zi3 +矸 1164 gan1gan4 +矹 1161 wu4 +矺 1261 tuo1 +矻 1861 ku4ku1wu4 +矼 1161 qiang1gang1kong4 +矽硅 1762 xi4xi1 silicon +矾礬 1761 fan2 +矿礦 1060 kuang4 mine 2128 +砀碭 1762 dang4 +码碼 1762 ma3 1293 +砂 1962 sha1 2758 +砃 1764 dan1 +砄 1568 jue2 +砅 1269 li4 +砆 1568 fu1 +砇 1064 min2 +砈砹 1161 nuo3 astatine +砉 5060 huo4hua1xu1 +砊 1061 kang4kang1 +砋 1161 zhi3 +砌 1762 qi4qie4 2842 +砍 1768 kan3 2059 +砎 1862 jie4 +砏 1862 fen1pan1 +砐 1764 e4 +砑 1164 ya4 +砒 1261 pi1 +砓 1764 zhe2 +研 1164 yan2yan4 867 +砕 1464 sui4 +砖磚 1563 zhuan1 brick 2239 +砗硨 1465 che1 +砘 1561 dun4 +砙 1161 pan1 +砚硯 1761 yan4 3111 +砛 1862 jin1 +砜碸 1761 feng1 +砝 1463 fa3 +砞 1569 mo4 +砟 1861 zha3 +砠 1761 qu1ju1 +砡 1161 yu4 +砢 1162 luo3ke1 +砣 1361 tuo2 +砤 1861 tuo2 +砥 1264 di3zhi3 +砦 2260 zhai4 +砧 1166 zhen1 +砨 1361 ai4 +砩 1562 fei4fu2 +砪 1765 mu3 +砫 1061 zhu3zhu4 +砬 1061 li4la2 +砭 1263 bian1 +砮 4760 nu3 +砯 1269 ping1 +砰 1164 peng1ping1peng4 3311 +砱 1862 ling2 +砲 1761 pao4 +砳 1166 le4 +破 1464 po4 519 +砵 1464 bo1 +砶 1660 po4 +砷 1560 shen1 arsenic +砸 1161 za2 2508 +砹砈 1464 nuo3ai4 +砺礪 1162 li4 +砻礱 4360 long2 +砼 1861 tong2 +砽 1762 yong4 +砾礫 1269 li4 3721 +砿 1063 kuang4 +础礎 1267 chu3 1893 +硁硜 1761 keng1 +硂 1861 quan2 +硃 1569 zhu1 +硄 1961 kuang1 +硅矽 1461 gui1huo4he4 silicon 3961 +硆 1866 e4 +硇 1660 nao2 +硈 1466 jia2 +硉 1560 lu4 +硊 1761 wei3 +硋 1068 ai4 +硌 1766 luo4li4ge4 +硍 1763 ken4 +硎 1260 xing2yan2keng1 +硏 1164 yan2 +硐 1762 tong2dong3dong4 +硑 1864 peng1 +硒 1166 xi1 selenium +硓 1461 lao3 +硔 1468 hong2 +硕碩 1168 shuo4shi2 2270 +硖硤 1568 xia2 +硗磽 1561 qiao1 +硘 1660 qing2 +硙磑 1261 wei4ai2wei2 +硚 1262 qiao2 +硛 1063 ceok +硜硁 1161 keng1 +硝 1962 xiao1qiao4 3711 +硞 1466 que4 +硟 1264 chan4 +硠 1763 lang3lang2 +硡 1363 hong2hong1 +硢 1869 yu2 +硣 1464 xiao1 +硤硖 1468 xia2 +硥 1361 mang3 +硦 1164 long4 +硧 1762 yong3tong2 +硨砗 1560 che1 +硩 5260 che4 +硪 1365 e2wo4yi3 +硫 1061 liu2chu4 sulphur 3710 +硬 1164 ying4geng3 stiff hard 941 +硭 1461 mang2 +确確 1762 que4 484 +硯砚 1661 yan4 +硰 3960 sha1 +硱 1660 kun3 +硲 1866 yu4 +硳 1463 ceok +硴 1461 hua1 +硵 1266 lu3 +硶 1262 chen3cen2 +硷礆 1861 jian3 soda +硸 1264 nue4 +硹 1863 song1 +硺 1163 zhuo2 +硻 1760 keng1 +硼 1762 peng2peng1 boron 5000 +硽 1461 yan3 +硾 1261 zhui4 +硿 1361 kong1 +碀 1765 cheng2 +碁 4460 qi2 +碂 1369 zong4 +碃 1562 qing4 +碄 1469 lin2 +碅 1660 jun1 +碆 1460 bo1 +碇 1368 ding4 +碈 1266 min2 +碉 1762 diao1 +碊 1365 jian1 +碋 1262 he4 +碌 1769 lu4liu4luo4 2522 +碍礙 1664 ai4 1546 +碎 1064 sui4 1407 +碏 1466 que4 +碐 1464 ling2leng2 +碑 1664 bei1 2083 +碒 1861 yin2 +碓 1061 dui4dui1 +碔 1364 wu3 +碕 1462 qi2 +碖 1862 lun4 +碗 1361 wan3 1823 +碘 1568 dian3 iodine +碙 1762 gang1 +碚 1066 bei4pei2 +碛磧 1568 qi4 +碜磣 1362 chen3 +碝 1168 ruan3 +碞 6060 yan2 +碟 1469 die2she2 plate 2750 +碠 1062 ding4 +碡 1565 du2zhou2 +碢 1762 tuo2 +碣 1662 jie2ke4ya4 +碤 1468 ying1 +碥 1262 bian3 +碦 1366 ke4 +碧 1660 bi4 1837 +碨 1663 wei1wei3 +碩硕 1168 shuo4shi2 +碪 1461 zhen1 +碫 1764 duan4 +碬 1764 xia2 +碭砀 1662 dang4 +碮 1668 ti2 +碯 1266 nao3 +碰 1861 peng4 touch 1291 +碱鹼 1365 jian3xian2 3931 +碲 1062 di4 tellurium +碳 1268 tan4 carbon 3978 +碴 1961 cha2cha1 +碵 1168 tian2 +碶 1768 qi4 +碷 1266 dun4 +碸砜 1761 feng1 +碹 1361 xuan4 +確确 1461 que4 +碻 1062 que4qiao1 +碼码 1162 ma3 +碽䂵 1168 gong1 +碾 1763 nian3 grind 3788 +碿 1762 su4 +磀 1863 e2 +磁 1863 ci2 magnet 2157 +磂 1766 liu4 +磃 1261 si1 +磄 1066 tang2 +磅 1062 bang4pang2 3465 +磆 1762 hua2 +磇 1661 pi1 +磈 1661 wei3kui3 +磉 1769 sang3 +磊 1066 lei3 2665 +磋 1861 cuo1 3150 +磌 1468 zhen1tian2 +磍 1366 xia2 +磎 1268 qi1xi1 +磏 1863 lian2 +磐 2760 pan2 3831 +磑硙 1261 wei4ai2wei2 +磒 1668 yun3 +磓 1763 dui1 +磔 1569 zhe2 +磕 1461 ke1ke3 2714 +磖 1766 la1la2 +磗 1364 zhuan1 +磘 1262 qing4 +磙 1063 gun3 +磚砖 1564 zhuan1 +磛 1260 chan2 +磜 1769 qi4 +磝 1864 ao2 +磞 1262 peng1 +磟 1762 lu4liu4 +磠硵 1166 lu3 +磡 1462 kan4 +磢 1468 chuang3 +磣碜 1362 chen3ca4 +磤 1764 yin3yin1 +磥 1669 lei3 +磦 1169 biao1 +磧碛 1568 qi4 +磨 0026 mo2mo4 grind 1458 +磩 1365 qi1qi4 +磪 1261 cui1 +磫 1868 zong1 +磬 4760 qing4 +磭 1162 chuo4 +磮 1262 lun2 +磯矶 1265 ji1 +磰 1866 shan4 +磱 1962 lao2 +磲 1169 qu2 +磳 1866 zeng1 +磴 1261 deng4deng1 +磵 1762 jian4 +磶 1762 xi4 +磷 1965 lin2 phosphorus 3391 +磸 1868 ding4 +磹 1164 dian4 +磺 1468 huang2 +磻 1266 pan2bo1 +磼 1069 za2 +磽硗 1461 qiao1 +磾 1664 di1 +磿 7126 li4 +礀 1762 jian4 +礁 1063 jiao1 3547 +礂 1466 xi1 +礃 1965 zhang3 +礄硚 1262 qiao2 +礅 1864 dun1 +礆硷 1868 xian3jian3 +礇 1768 yu4 +礈 1863 zhui4 +礉 1864 he2 +礊 5760 huo4 +礋 1664 zhai2ze2 +礌 1166 lei2lei3 +礍 1462 ke3 +礎础 1468 chu3 +礏 1269 ji2 +礐 7760 que4 +礑 1966 dang4 +礒 1865 yi3 +礓 1161 jiang1 +礔 1064 pi4 +礕 7060 pi1 +礖 1768 yu4 +礗 1368 pin1 +礘 1663 qi4 +礙碍 1768 ai4 +礚 1461 kai4ke1 +礛 1861 jian1 +礜 7760 yu4 +礝 1162 ruan3 +礞 1463 meng2 +礟 1464 pao4 +礠 1863 ci2 +礡 1464 bo2 +礢 1863 yang3 +礣 1465 mie4 +礤 1469 ca3 +礥 1768 xian2 +礦矿 1068 kuang4 +礧 1666 lei4lei2lei3 +礨 6060 lei3 +礩 1268 zhi4 +礪砺 1162 li4 +礫砾 1269 li4luo4 +礬矾 4460 fan2 +礭 1161 que4 +礮 1064 pao4 +礯 1969 ying1 +礰 1161 li4 +礱砻 0160 long2 +礲 1161 long2 +礳 1066 mo4 +礴 1464 bo2 +礵 1166 shuang1 +礶 1461 guan4 +礷 1461 lan2 +礸 1468 zan3 +礹 1664 yan2 +示 1090 shi4 u 436 +礻 3023 shi4 +礼禮 3221 li3 681 +礽 3722 reng2 +社 3421 she4 558 +礿 3722 yue4 +祀 3721 si4 3227 +祁 3722 qi2zhi3 2834 +祂 3421 ta1 +祃禡 3722 ma4 +祄 3832 xie4 +祅 3228 yao1xian1 +祆 3228 xian1yao1 +祇 3224 qi2zhi3 +祈 3222 qi2gui3 2475 +祉 3121 zhi3 +祊 3022 beng1 +祋 3724 dui4 +祌 3520 zhong4zhong3 +祍 3221 ren4 +祎禕 3522 yi1 +祏 3126 shi2 +祐 3426 you4 +祑 3528 zhi4 +祒 3726 tiao2 +祓 3324 fu2fei4 +祔 3420 fu4 +祕 3320 mi4 +祖 3721 zu3jie1 898 +祗 3224 zhi1 +祘 1199 suan4 +祙 3529 mei4 +祚 3821 zuo4 +祛 3423 qu1 +祜 3426 hu4 +祝 3621 zhu4 1362 +神 3520 shen2 216 +祟 2290 sui4 3345 +祠 3722 ci2si4 3074 +祡 2290 chai2 +祢禰 3829 mi2ni3 +祣 3823 lv3 +祤 3722 yu3xu3 +祥 3825 xiang2 1329 +祦 3628 wu2 +祧 3221 tiao1 +票 1090 piao4piao1 1162 +祩 3529 zhu1 +祪 3721 gui3 +祫 3826 xia2 +祬 3121 zhi1 +祭 2790 ji4zhai4 2084 +祮 3426 gao4 +祯禎 3128 zhen1zheng1 3652 +祰 3426 gao4 +祱 3821 shui4 +祲 3724 jin1jin4 +祳 3123 chen3 +祴 3325 gai1 +祵 3620 kun3hun2 +祶 3822 di4 +祷禱 3424 dao3 2557 +祸禍 3622 huo4 1804 +祹 3722 tao2 +祺 3428 qi2 3807 +祻 3620 gu4 +祼 3629 guan4 +祽 3024 zui4 +祾 3424 ling2 +祿禄 3729 lu4 +禀稟 0090 bing3 2970 +禁 4490 jin4jin1 845 +禂 3722 dao3 +禃 3421 zhi2 +禄祿 3729 lu4 2348 +禅禪 3825 chan2shan4 zen 2463 +禆 3624 bei1 +禇 3426 zhe3zhu3chu3 +禈 3725 hui1 +禉 3826 you3 +禊 3728 xi4 +禋 3121 yin1 +禌 3823 zi1 +禍祸 3722 huo4 +禎祯 3128 zhen1zheng1 +福 3126 fu2fu4 646 +禐 3224 yuan4 +禑 3622 wu2 +禒 3723 xian3 +禓 3622 yang2 +禔 3628 ti2zhi1 +禕祎 3425 yi1 +禖 3429 mei2 +禗 3623 si1 +禘 3022 di4 +禙 3222 bei4 +禚 3823 zhuo2 +禛 3428 zhen1 +禜 9990 yong3ying2 +禝 3624 ji2 +禞 3022 gao4 +禟 3026 tang2 +禠 3221 si1 +禡祃 3122 ma4 +禢 3622 ta1 +禣 3324 fu4 +禤 3622 xuan1 +禥 0421 qi2 +禦御 2790 yu4 +禧 3426 xi3xi1 3881 +禨 3225 ji1ji4 +禩 3628 si4 +禪禅 3625 chan2shan4 +禫 3124 tan3dan4 +禬 3826 kuai4gui4hui4 +禭 3823 sui4 +禮礼 3521 li3 +禯 3523 nong2 +禰祢 3122 ni3mi2xian3 +禱祷 3424 dao3 +禲 3122 li4 +禳 3023 rang2 +禴 3822 yue4 +禵 3123 ti2 +禶 3428 zan3 +禷 3128 lei4 +禸 4022 rou2 u +禹 2022 yu3 2676 +禺 6022 yu2yu4ou3 +离離 0022 li2 362 +禼 2122 xie4 +禽 8022 qin2 2482 +禾 2090 he2 u 3084 +禿秃 2021 tu1 +秀 2022 xiu4 743 +私 2293 si1 908 +秂 2080 ren2 +秃禿 2021 tu1 bald 2547 +秄 2794 zi3 +秅 2291 cha2 +秆稈 2194 gan3 +秇 2591 yi4zhi2 +秈籼 2297 xian1 +秉 2090 bing3 2798 +秊 2040 nian2 +秋 2998 qiu1 autumn fall 824 +秌 9289 qiu1 +种種 2590 zhong3zhong4 131 +秎 2892 fen2 +秏 2291 hao4 +秐 2193 yun2 +科 2490 ke1ke4 647 +秒 2992 miao3 second 2271 +秓 2494 zhi1 +秔 2091 geng1jing1 +秕 2291 bi3 +秖 2294 zhi1zhi3 +秗 2298 yu4 +秘 2390 mi4bi4 951 +秙 2496 ku4 +秚 2995 ban4 +秛 2494 pi1 +秜 2791 ni2li2 +秝 2299 li4 +秞 2596 you2 +租 2791 zu1ju1 1686 +秠 2191 pi1 +秡 2394 ba2 +秢 2893 ling2 +秣 2599 mo4 +秤 2194 cheng4 3257 +秥 2196 nian2 +秦 5090 qin2 1339 +秧 2598 yang1 3709 +秨 2891 zuo2 +秩 2598 zhi4 2295 +秪 2294 zhi1 +秫 2399 shu2shu4 +秬 2191 ju4 +秭 2592 zi3 +秮 2296 huo2kuo4 +积積 2698 ji1 923 +称稱 2899 cheng1chen4cheng4 443 +秱 2792 tong2 +秲 2494 zhi4 +秳 2296 huo2 +秴 2896 he2 +秵 2690 yin1 +秶 3790 zi1ci2ji4 +秷 2191 zhi2 +秸 2496 jie1ji2 +秹 2291 ren3 +秺 2391 du4 +移 2792 yi2chi3yi4 793 +秼 2599 zhu1 +秽穢 2292 hui4 2650 +秾穠 2493 nong2 +秿 2392 fu3 +稀 2492 xi1 1649 +稁 0090 kao3kao4gao4 +稂 2393 lang2 +稃 2294 fu1fu2 +稄 2394 ze4 +稅税 2891 shui4 +稆穭 2696 lv3 +稇 2690 kun3 +稈秆 2694 gan3 +稉 2194 jing1 +稊 2892 ti2 +程 2691 cheng2 354 +稌 2899 tu2 +稍 2992 shao1shao4 1338 +税稅 2891 shui4 tax 1740 +稏䅉 2191 ya4 +稐 2892 lun3 +稑 2491 lu4 +稒 2690 gu4 +稓 2496 zuo2 +稔 2893 ren3 +稕 2094 zhun4 +稖 2096 bang4 +稗 2694 bai4 +稘 2498 ji1 +稙 2491 zhi2 +稚 2091 zhi4 2478 +稛 2690 kun3 +稜 2494 leng2leng4ling2 +稝 2792 peng2 +稞 2699 ke1hua4 +稟禀 0090 bing3 +稠 2792 chou2 3442 +稡 2094 zu2 +稢 2395 yu4 +稣穌 2416 su1 +稤 2099 lue4lue3 +稥 2060 xiang1 +稦 2495 yi1 +稧 2798 xi4 +稨 2392 bian1 +稩 2692 ji4 +稪 2894 fu4 +稫 2196 bi1 +稬 2198 nuo4 +稭 2296 jie1 +種种 2291 zhong3zhong4chong2 +稯 2294 zong1 +稰 2792 xu1 +稱称 2295 cheng1cheng4chen4 +稲 2296 dao4 +稳穩 2793 wen3 1036 +稴 2893 lian2 +稵 2893 zi1jiu1 +稶 2395 yu4 +稷 2694 ji4ze4 3686 +稸 2096 xu4 +稹 2498 zhen3zhen1bian1 +稺 2794 zhi4 +稻 2297 dao4 2506 +稼 2393 jia4 2877 +稽 2396 ji1qi3 2287 +稾 0090 gao3 +稿 2092 gao3 1722 +穀 4794 gu3 u +穁 2494 rong2 +穂 2593 sui4 +穃 2396 rong4 +穄 2799 ji4 +穅 2099 kang1 +穆 2692 mu4 1806 +穇 2392 shan1can3 +穈 0029 men2mei2 +穉 2795 zhi4 +穊 2191 ji4 +穋 2792 lu4 +穌稣 2239 su1 +積积 2598 ji1 +穎颖 2198 ying3 +穏 2293 wen3 +穐 2791 qiu1 +穑穡 2496 se4 +穒 2032 kweok +穓 2698 yi4 +穔 2498 huang2 +穕 2099 qie4 +穖 2295 ji3 +穗 2593 sui4 3274 +穘 2491 xiao1 +穙 2298 pu2 +穚 2292 jiao1 +穛 2093 zhuo1 +穜 2091 tong2zhong4 +穝 2694 zuo1 +穞 2796 lv3 +穟 2893 sui4 +穠秾 2593 nong2 +穡穑 2496 se4 +穢秽 2195 hui4 +穣 2093 rang2 +穤 2192 nuo4 +穥 2798 yu4 +穦 2398 pin1 +穧 2092 ji4 +穨 2528 tui2 +穩稳 2293 wen3 +穪 2192 cheng1 +穫获 2494 huo4 +穬 2098 gong3kuang4 +穭稆 2796 lv3 +穮 2093 biao1 +穯 2496 se4 +穰 2093 rang2 +穱 2294 zhuo1 +穲 2191 li2 +穳 2498 zan4 +穴 3080 xue2 u hole 2029 +穵 3071 wa1 +究 3041 jiu1jiu4 485 +穷窮 3042 qiong2 poor 1164 +穸 3020 xi4xi1 +穹 3020 qiong2 3535 +空 3010 kong1kong4kong3 empty 314 +穻 3040 yu1 +穼 3090 sen1 +穽 3055 jing3 +穾 3080 yao4 +穿 3024 chuan1 685 +窀 3071 zhun1tun2 +突 3080 tu1tu2 506 +窂 3050 lao2 +窃竊 3072 qie4 1996 +窄 3021 zhai3ze2 2299 +窅 3060 yao3 +窆 3030 bian3 +窇 3071 bao2 +窈 3072 yao3yao4 +窉 3022 bing3 +窊 3023 wa1 +窋 3077 zhu2ku1 +窌 3022 jiao4 +窍竅 3012 qiao4 2850 +窎窵 3012 diao4 +窏 3014 wu1 +窐 3010 gui1wa1 +窑窯 3077 yao2 2978 +窒 3010 zhi4die2 3105 +窓 3033 chuang1cong1 +窔 3040 yao3yao4 +窕 3011 tiao3tiao1yao2 +窖 3060 jiao4zao4 3276 +窗 3060 chuang1cong1 window 808 +窘 3060 jiong3 2937 +窙 3040 xiao1 +窚 3025 cheng2 +窛 3021 kou4 +窜竄 3050 cuan4 2518 +窝窩 3022 wo1 nest 1691 +窞 3077 dan4 +窟 3027 ku1 2597 +窠 3090 ke1 +窡 3044 zhui4 +窢 3015 xu4 +窣 3040 su4su1 +窤 3071 guan1 +窥窺 3081 kui1kui3 2601 +窦竇 3080 dou4 2962 +窧 3040 zhuo1 +窨 3060 yin4xun1yin1 +窩窝 3022 wo1 +窪洼 3011 wa1 +窫 3080 ya4 +窬 3022 yu2dou4dou1 +窭窶 3040 ju4lou2 +窮穷 3022 qiong2 +窯窑 3033 yao2 +窰 3077 yao2 +窱 3029 tiao4tiao3 +窲 3094 chao2 +窳 3023 yu3yu2 +窴 3080 tian2 +窵窎 3032 diao4 +窶窭 3040 ju4lou2 +窷 3012 liao2 +窸 3033 xi1 +窹 3026 wu4 +窺窥 3051 kui1kui3 +窻 3033 chuang1 +窼 3090 zhao1cong1 +窽 3088 kuan3cuan4 +窾 3098 kuan3 +窿 3021 long2 3776 +竀 3011 cheng1 +竁 3071 cui4 +竂 3090 piao2 +竃 3071 zao4 +竄窜 3071 cuan4cuan1 +竅窍 3024 qiao4 +竆 3026 qiong2 +竇窦 3080 dou4du2 +竈灶 3071 zao4 +竉 3021 long3 +竊窃 3092 qie4 +立 0010 li4 u 161 +竌 0711 chu4 +竍 0410 shi2 +竎 0044 fou4 +竏 0214 qian1 +竐 0714 chu4qi4 +竑 0413 hong2 +竒 0062 qi2 +竓 0211 hao2 +竔 0410 sheng1 +竕 0812 fen1 +竖竪 2710 shu4 verticle 2192 +竗 0912 miao4miao3 +竘 0712 ju3qu3 +站 0116 zhan4 stand 389 +竚 0312 zhu4 +竛 0813 ling2 +竜 0071 long2 +竝 0011 bing4bang4 +竞競 0021 jing4 1384 +竟 0021 jing4 583 +章 0040 zhang1 chapter 610 +竡 0116 bai3 +竢 0318 si4 +竣 0314 jun4 3665 +竤 0313 hong2 +童 0010 tong2 1046 +竦 0519 song3 +竧 0714 jing4 +竨 0114 diao4 +竩 0311 yi4 +竪竖 7710 shu4 +竫 0715 jing4 +竬 0212 qu3 +竭 0612 jie2 2146 +竮 0714 ping2 +端 0212 duan1 670 +竰 0111 shao2 +竱 0514 zhuan3 +竲 0816 ceng2 +竳 0211 deng1 +竴 0814 cui1 +竵 0112 huai1 +競竞 0021 jing4 +竷 0844 kan4 +竸 0021 jing4 +竹 8822 zhu2 u bamboo 1352 +竺 8810 zhu2du3 3392 +竻 8842 le4 +竼 8821 peng2 +竽 8840 yu2 +竾 8871 chi2 +竿 8840 gan3 pole rod 2917 +笀 8871 mang2 +笁 8810 zhu2 +笂 8851 wan2 +笃篤 8812 du3 2949 +笄 8844 ji1 +笅 8840 xiao2 +笆 8871 ba1 3976 +笇 8823 suan4 +笈 8824 ji2 +笉 8812 zhen3 +笊 8823 zhao4 +笋筍 8850 sun3 3209 +笌 8824 ya2 +笍 8822 zhui4 +笎 8821 yuan2 +笏 8822 hu4wen3wu4 +笐 8821 gang1hang4 +笑 8880 xiao4 laugh 417 +笒 8820 cen2 +笓 8871 pi2 +笔筆 8871 bi3 pen 700 +笕筧 8821 jian3 +笖 8878 yi3 +笗 8830 dong1 +笘 8860 shan1 +笙 8810 sheng1 3360 +笚 8850 xia2 +笛 8860 di2 2420 +笜 8877 zhu2 +笝 8860 na4 +笞 8860 chi1 +笟 8823 gu1 +笠 8810 li4 3537 +笡 8810 qie4 +笢 8874 min3 +笣 8871 bao1 +笤 8860 tiao2shao4 +笥 8862 si4 +符 8824 fu2 1234 +笧 8844 ce4 +笨 8823 ben4 stupid silly 2410 +笩 8824 pei4 +笪 8810 da2 +笫 8822 zi3 +第 8822 di4 152 +笭 8820 ling2 +笮 8821 ze2zuo2zha4 +笯 8844 nu2 +笰 8852 fu2 +笱 8862 gou3 +笲 8844 fan2fan1 +笳 8846 jia1 +笴 8862 ge3gao3 +笵 8811 fan4 +笶 8880 shi3 +笷 8872 mao3 +笸 8871 po3 +笹 8871 ti4 +笺箋 8850 jian1 3268 +笻 8812 qiong2 +笼籠 8841 long2long3 1904 +笽 8810 min3 +笾籩 8830 bian1 +笿 8860 luo4 +筀 8810 gui4 +筁 8860 qu3 +筂 8811 chi2 +筃 8860 yin1 +筄 8811 yao4 +筅 8821 xian3 +筆笔 8850 bi3 +筇 8812 qiong2 +筈 8860 gua1kuo4 +等 8834 deng3 105 +筊 8840 jiao3 +筋 8822 jin1qian2 2032 +筌 8810 quan2 +筍笋 8862 sun3 +筎 8846 ru2 +筏 8825 fa2 3863 +筐 8871 kuang1 3358 +筑築 8811 zhu2zhu4 1419 +筒 8822 tong3 tube 2053 +筓 8844 ji1 +答 8860 da2da1 489 +筕 8822 xing2hang2 +策 8890 ce4 966 +筗 8825 zhong4 +筘 8856 kou4 +筙 8890 lai2 +筚篳 8840 bi4 +筛篩 8822 shai1 3035 +筜簹 8817 dang1 +筝箏 8850 zheng1 2972 +筞 8890 ce4 +筟 8840 fu1 +筠 8812 yun2jun1 3565 +筡 8890 tu2 +筢 8851 pa2 +筣 8892 li4 +筤 8873 lang2 +筥 8860 ju3 +筦 8821 guan3 +筧笕 8821 jian3jian4 +筨 8860 han2 +筩 8822 tong3 +筪 8871 xia2 +筫 8880 zhi4 +筬 8825 cheng2 +筭 8844 suan4 +筮 8810 shi4 +筯 8812 zhu4 +筰 8821 zuo2 +筱 8824 xiao3 3585 +筲 8822 shao1 +筳 8840 ting2 +筴䇲 8880 ce4jia1 +筵 8840 yan2 3538 +筶 8860 gao3 +筷 8898 kuai4 3044 +筸 8840 gan1 +筹籌 8834 chou2 1817 +筺 8871 kuang1 +筻 8850 gang4 +筼篔 8880 yun2 +筽 8880 e1 +签簽 8810 qian1 1449 +筿 8890 xiao3 +简簡 8822 jian3 simple 609 +箁 8860 pu2 +箂 8890 lai2 +箃 8844 zou1 +箄 8840 bi4bei1pai2 +箅 8822 bi4 +箆 8871 bi4 +箇 8860 ge4ge3 +箈 8816 chi2dai4tai2 +箉 8852 guai3 +箊 8823 yu1 +箋笺 8850 jian1 +箌 8812 zhao4 +箍 8851 gu1 3517 +箎 8821 chi2 +箏筝 8850 zheng1 +箐 8822 jing1qing4qiang1 +箑 8880 sha4jie2 +箒 8822 zhou3 +箓籙 8890 lu4 +箔 8816 bo2 +箕 8880 ji1 3811 +箖 8899 lin2 +算 8844 suan4 240 +箘 8860 jun4 +箙 8824 fu2 +箚 8862 zha2da2 +箛 8843 gu1 +箜 8810 kong1 +箝 8857 qian2 +箞 8871 quan1 +箟 8871 jun4 +箠 8810 chui2 +管 8877 guan3 tube pipe 200 +箢 8821 yuan1wan3 +箣 8892 ce4 +箤 8840 ju2 +箥 8814 bo3 +箦簀 8880 ze2 +箧篋 8871 qie4 +箨籜 8855 tuo4 +箩籮 8820 luo2 +箪簞 8850 dan1 +箫簫 8822 xiao1xiao3 3324 +箬 8860 ruo4na4 +箭 8822 jian4 arrow 1520 +箮 8810 xuan1 +箯 8824 bian1 +箰 8840 sun3 +箱 8896 xiang1 1295 +箲 8811 xian3 +箳 8824 ping2 +箴 8825 zhen1jian3 +箵 8860 sheng3xing1xing3 +箶 8862 hu2 +箷 8821 shi1 +箸 8860 zhu4zhuo2 +箹 8892 yue1 +箺 8860 chun3 +箻 8825 lv4 +箼 8821 wu1 +箽 8810 dong3 +箾 8822 shuo4xiao1qiao4 +箿 8810 ji2 +節节 8872 jie2jie1 +篁 8810 huang2 +篂 8810 xing1 +篃 8826 mei2 +範范 8851 fan4 +篅 8822 chui2chuan2 +篆 8823 zhuan4 3595 +篇 8822 pian1 1113 +篈 8814 feng1 +築筑 8890 zhu2zhu4 +篊 8818 hong2 +篋箧 8871 qie4 +篌 8828 hou2 +篍 8898 qiu1 +篎 8862 miao3 +篏 8878 qian4 +篐 8891 gu1 +篑簣 8880 kui4 +篒 8873 yi4 +篓簍 8840 lou3 3759 +篔筼 8880 yun2 +篕 8810 he2 +篖 8826 tang2 +篗 8840 yue4 +篘 8842 chou1 +篙 8822 gao1 +篚 8871 fei3 +篛 8812 ruo4 +篜 8822 zheng1 +篝 8855 gou1 +篞 8831 nie4 +篟 8822 qian4 +篠 8829 xiao3 +篡 8873 cuan4 3495 +篢 8880 gong1long3 +篣 8822 pang2peng2 +篤笃 8832 du3 +篥 8890 li4 +篦 8871 bi4pi2 +篧 8821 zhuo2 +篨 8829 chu2 +篩筛 8872 shai1shi1 +篪 8821 chi2 +篫 8850 zhu2 +篬 8826 qiang1 +篭 8821 long2 +篮籃 8810 lan2 2221 +篯 8875 jian1 +篰 8862 bu4 +篱籬 8822 li2 3174 +篲 8817 hui4sui4 +篳筚 8850 bi4 +篴 8830 di2 +篵 8823 cong1 +篶 8832 yan1 +篷 8830 peng2 2540 +篸 8820 sen1cen1zan1 +篹 8871 zhuan4suan3zuan3 +篺 8854 pai2 +篻 8890 piao4piao3 +篼 8821 dou1 +篽 8822 yu3 +篾 8825 mie4 +篿 8834 zhuan1tuan2 +簀箦 8880 ze2zhai4 +簁 8828 xi3 +簂 8860 guo2 +簃 8892 yi2 +簄 8821 hu4 +簅 8821 chan3 +簆 8821 kou4 +簇 8828 cu4 2407 +簈 8824 ping2 +簉 8830 chou4zao4 +簊 8810 ji1 +簋 8810 gui3 +簌 8858 su4 3708 +簍篓 8840 lou3 +簎 8856 zha4 +簏 8821 lu4 +簐 8858 nian3 +簑 8873 suo1 +簒 8873 cuan4 +簓 8822 diao1 +簔 8873 suo1 +簕 8852 le4 +簖籪 8872 duan4 +簗 8890 zhu4 +簘 8822 xiao1xiao3 +簙 8844 bo2 +簚 8825 mi4 +簛 8882 si1 +簜 8812 dang4 +簝 8890 liao2lao3 +簞箪 8850 dan1 +簟 8840 dian4 +簠 8810 fu3 +簡简 8822 jian3 +簢 8822 min3 +簣篑 8880 kui4 +簤 8880 dai4 +簥 8822 jiao1qiao2 +簦 8810 deng1 +簧 8880 huang2 3237 +簨 8880 sun3 +簩 8842 lao2 +簪 8860 zan1zan3 3872 +簫箫 8822 xiao1xiao3 +簬 8816 lu4du4 +簭 8860 shi4 +簮 8860 zan1zan3 +簯 8898 qi2 +簰 8824 pai2bei1 +簱 8828 qi2 +簲 8824 pai2 +簳 8844 gan4gan3 +簴 8828 ju4 +簵 8856 du4lu4 +簶 8829 lu4 +簷 8826 yan2 +簸 8884 bo4bo3 3415 +簹筜 8860 dang1 +簺 8810 sai4 +簻 8830 ke1zhua1 +簼 8858 long2 +簽签 8888 qian1 +簾帘 8823 lian2 +簿 8814 bu4bo2 2447 +籀 8856 zhou4 +籁籟 8898 lai4 3698 +籂 8872 shi1 +籃篮 8810 lan2 +籄 8871 kui4 +籅 8880 yu2 +籆 8840 yue4 +籇 8823 hao2 +籈 8811 zhen1 +籉 8810 tai2 +籊 8821 ti4di2 +籋 8822 mi2 +籌筹 8864 chou2 +籍 8896 ji2 1656 +籎 8888 yi2 +籏 8828 qi2 +籐 8829 teng2 +籑 8873 zhuan4 +籒 8856 zhou4 +籓 8816 fan1fan2 +籔䉤 8844 sou3shu4 +籕 8896 zhou4 +籖 8815 qian1 +籗 8821 zhuo2 +籘 8829 teng2 +籙箓 8819 lu4 +籚 8821 lu2 +籛篯 8815 jian1 +籜箨 8854 tuo4 +籝 8821 ying2 +籞 8890 yu4 +籟籁 8898 lai4 +籠笼 8821 long2long3 +籡 8858 qie4 +籢 8884 lian2 +籣 8822 lan2 +籤 8815 qian1 +籥 8822 yue4 +籦 8811 zhong1 +籧 8830 qu2ju3 +籨 8888 lian2 +籩笾 8830 bian1 +籪簖 8872 duan4 +籫 8880 zuan3 +籬篱 8821 li2 +籭 8821 si1 +籮箩 8891 luo2 +籯 8821 ying2 +籰 8840 yue4 +籱 8821 zhuo2 +籲 8828 yu4 +米 9090 mi3 u meter 891 +籴糴 8090 di2za2 +籵 9490 fan2 +籶 9791 shen1 +籷 9291 zhe2 +籸 9791 shen1 +籹 9494 nv3 +籺 9891 xie2he2 +类類 9080 lei4 493 +籼秈 9297 xian1 +籽 9794 zi3 +籾 9795 ni2 +籿 9490 cun4 +粀 9590 zhang4 +粁 9294 qian1 +粂 2790 zhai1 +粃 9291 bi3 +粄 9294 ban3 +粅 9792 wu4 +粆 9992 sha1 +粇 9091 kang1 +粈 9791 rou3 +粉 9892 fen3 pink flour 1417 +粊 2290 bi4 +粋 9494 cui4 +粌 9290 yin3 +粍 9291 li2 +粎 9798 chi3 +粏 9493 ta4 +粐 9390 hu4 +粑 9791 ba1 +粒 9091 li4 2026 +粓 9497 gan1 +粔 9191 ju4 +粕 9690 po4 +粖 9599 mo4 +粗 9791 cu1 1333 +粘 9196 zhan1nian2 viscous sticky 2441 +粙 9596 zhou4 +粚 9891 li2 +粛 5022 su4 +粜糶 2290 tiao4 +粝糲 9192 li4 +粞 9196 xi1qi1 +粟 1090 su4 3107 +粠 9498 hong2 +粡 9792 tong2 +粢 3790 zi1ci2ji4 +粣 9794 ce4san3 +粤粵 2602 yue4 3328 +粥 1722 zhou1yu4zhu4 2993 +粦 9025 lin4lin2 +粧 9091 zhuang1 +粨 9196 bai3 +粩 9491 lao1 +粪糞 9080 fen4san1 2902 +粫 9192 er2 +粬 9596 qu1 +粭 9896 he2 +粮糧 9393 liang2 provisions 1579 +粯 9691 xian4 +粰 9294 fu2fu1 +粱 3390 liang2 3658 +粲 2790 can4 +粳 9194 geng1jing1 +粴 9691 li3 +粵粤 2602 yue4 +粶 9799 lu4 +粷 9792 ju2 +粸 9498 qi2 +粹 9094 cui4sui4 2558 +粺 9694 bai4 +粻 9193 zhang1 +粼 9220 lin2lin3 +粽 9399 zong4 +精 9592 jing1 372 +粿 9699 guo3 +糀 9491 hua1 +糁糝 9392 san1san3 +糂 9491 san3 +糃 9692 tang2 +糄 9392 bian1 +糅 9799 rou3rou2 +糆 9196 mian4 +糇餱 9798 hou2 +糈 9792 xu3 +糉 9294 zong4 +糊 9792 hu2hu1hu4 1288 +糋 9892 jian4 +糌 9896 zan2zan1 +糍 9893 ci2zi1 +糎 9191 li2 +糏 9792 xie4 +糐 9394 fu1 +糑 9792 ni4 +糒 9492 bei4 +糓 4794 gu3 +糔 9793 xiu3xiu1 +糕 9893 gao1 cake 2457 +糖 9096 tang2 sugar 2214 +糗 9698 qiu3 +糘 9393 jia1 +糙 9493 cao1 3115 +糚 9491 zhuang1 +糛 9991 tang2 +糜 0029 mi2mei2 +糝糁 9392 san3san1 +糞粪 9080 fen4 +糟 9596 zao1 2056 +糠 9099 kang1 +糡 9091 jiang4 +糢 9498 mo2 +糣 9196 san3san1 +糤 9894 san3 +糥 9192 nuo4 +糦 9496 xi1chi4 +糧粮 9691 liang2 +糨 9393 jiang4jiang1 +糩 9896 kuai4 +糪 7090 bo2 +糫 9693 huan2 +糬 9696 shu3 +糭 9294 zong4 +糮 9891 xian4 +糯 9192 nuo4 +糰 9690 tuan2 +糱 2090 nie4 +糲粝 9192 li4 +糳 3790 zuo4 +糴籴 8791 di2 +糵 4490 nie4 +糶粜 2791 tiao4 +糷 9492 lan2 +糸 2090 mi4si1 u +糹纟 2090 si1 +糺 2291 jiu1jiu3jiao3 +系係 2090 xi4ji4 297 +糼 2492 gong1 +糽 2192 zheng3 +糾纠 2290 jiu1jiu3 +糿 2792 you4 +紀纪 2791 ji4ji3 +紁 2490 cha4 +紂纣 2490 zhou4 +紃 2290 xun2 +約约 2792 yue1 +紅红 2191 hong2gong1 +紆纡 2194 yu1yu3ou1 +紇纥 2891 he2ge1jie2 +紈纨 2591 wan2 +紉纫 2792 ren4 +紊 0090 wen4wen3 3166 +紋纹 2094 wen2wen4 +紌 2391 qiu2 +納纳 2492 na4 +紎 2398 zi1 +紏 2490 tou3 +紐纽 2791 niu3 +紑 2199 fou2 +紒 2892 jie4ji4 +紓纾 2792 shu1 +純纯 2591 chun2 +紕纰 2291 pi1pi2bi3 +紖纼 2290 yin3zhen4 +紗纱 2992 sha1miao3 +紘纮 2493 hong2 +紙纸 2294 zhi3 +級级 2794 ji2 +紛纷 2892 fen1 +紜纭 2193 yun2 +紝纴 2291 ren4ren2 +紞 2491 dan3 +紟 2892 jin1jin4 +素 5090 su4 660 +紡纺 2092 fang3 +索 4090 suo3 613 +紣 2494 cui4 +紤 2292 jiu3 +紥 5290 zha2za1 +紦 2791 ha1 +紧緊 2790 jin3 406 +紨 2490 fu4 +紩 2598 zhi4 +紪 2291 ci3 +紫 2290 zi3 purple 1318 +紬䌷 2596 chou2chou1 +紭 2293 hong2 +紮 4290 za1zha1zha2 +累纍 6090 lei4lei3lei2 1077 +細细 2690 xi4 +紱绂 2394 fu2 +紲绁 2491 xie4yi4 +紳绅 2590 shen1 +紴 2494 bei4 +紵纻 2392 zhu4 +紶 2493 qu3 +紷 2893 ling2 +紸 2091 zhu4 +紹绍 2796 shao4chao1 +紺绀 2497 gan4 +紻 2598 yang1 +紼绋 2592 fu2fei4 +紽 2391 tuo2 +紾 2892 zhen3tian3 +紿绐 2396 dai4 +絀绌 2297 chu4zhuo2 +絁 2891 shi1 +終终 2793 zhong1 +絃 2093 xian2 +組组 2791 zu3qu1 +絅䌹 2792 jiong3 +絆绊 2995 ban4 +絇 2792 ju4qu2 +絈 2690 mo4 +絉 2399 shu4 +絊 2593 zui4 +絋 2093 kuang4 +経 2791 jing1 +絍 2291 ren2ren4 +絎绗 2192 heng4hang2 +絏 2590 xie4yi4 +結结 2496 jie2jie1 +絑 2599 zhu1 +絒 2290 chou2 +絓 2491 gua4 +絔 2196 bai3 +絕绝 2791 jue2 +絖 2991 kuang4 +絗 2690 hu2 +絘 2798 ci4 +絙 2191 geng1 +絚 2191 geng1geng4 +絛绦 2829 tao1 +絜 5790 xie2jie2 +絝绔 2492 ku4 +絞绞 2094 jiao3xiao2jiao4 +絟 2891 quan1 +絠 2492 gai3 +絡络 2796 luo4lao4 +絢绚 2792 xuan4xun2 +絣 2894 bing1beng1 +絤 2196 xian4 +絥 2398 fu2bei4 +給给 2896 gei3ji3xia2 +絧 2792 tong2 +絨绒 2395 rong2 +絩 2291 tiao4 +絪 2690 yin1 +絫 2390 lei3 +絬 2296 xie4 +絭 9090 quan4juan4 +絮 4690 xu4 2767 +絯 2098 gai1 +絰绖 2191 die2 +統统 2091 tong3 +絲丝 2299 si1 +絳绛 2795 jiang4 +絴 2895 xiang2 +絵 2893 hui4 +絶绝 2791 jue2 +絷縶 5590 zhi2 +絸 2691 jian3 +絹绢 2692 juan4xuan4 +絺 2492 chi1 +絻 2791 mian3wen4 +絼 2292 zhen3zhi4 +絽 2696 lv3 +絾 2395 cheng2 +絿 2399 qiu2 +綀 2599 shu1 +綁绑 2792 bang3 +綂 2091 tong3 +綃绡 2992 xiao1shao1 +綄 2391 wan4huan3 +綅 2794 qin1xian1 +綆绠 2194 geng3bing3 +綇 2196 xiu3 +綈绨 2892 ti2ti4 +綉绣 2292 xiu4tou4 +綊 2498 xie2 +綋 2393 hong2 +綌绤 2896 xi4 +綍 2494 fu2 +綎 2294 ting1ting2 +綏绥 2294 sui2 +綐䌼 2891 dui4 +綑 2690 kun3 +綒 2294 fu1 +經经 2191 jing1jing4 +綔 4229 hu4 +綕 2493 zhi1 +綖 2294 yan2xian4 +綗 2792 jiong3 +綘 2795 feng2 +継 2991 ji4 +続 2491 xu4 +綛 2793 ren3 +綜综 2399 zong1zong4zeng4 +綝 2499 lin2chen1shen1 +綞缍 2291 duo3 +綟 2398 li4 +綠绿 2799 lv4lu4 +綡 2099 liang2 +綢绸 2792 chou2tao1diao4 +綣绻 2991 quan3 +綤 1790 shao4 +綥 2692 qi4 +綦 4490 qi2 +綧 2094 zhun3 +綨 2498 qi2 +綩 2391 wan3 +綪 2592 qian4zheng1 +綫线 2395 xian4 +綬绶 3294 shou4 +維维 2091 wei2yi2 +綮 3890 qi3qing4 +綯绹 2792 tao2 +綰绾 2397 wan3 +綱纲 2792 gang1 +網网 2792 wang3 u +綳绷 2792 beng1beng3 +綴缀 2794 zhui4chuo4 +綵䌽 2299 cai3 +綶 2699 guo3 +綷 2094 cui4 +綸纶 2892 lun2guan1 +綹绺 2896 liu3 +綺绮 2492 qi3yi3 +綻绽 2398 zhan4 +綼 2694 bei1bi4 +綽绰 2194 chuo4chao1 +綾绫 2494 ling2 +綿绵 2692 mian2 +緀 2594 qi1 +緁 2598 qie4ji1qi1qi4 +緂 2998 tan1tian2 +緃 2898 zong1 +緄绲 2691 gun3hun4hun2 +緅 2794 zou1 +緆 2692 yi4xi4 +緇缁 2296 zi1 +緈 2494 xing4 +緉 2192 liang3 +緊紧 7790 jin3 +緋绯 2191 fei1 +緌 2294 rui2 +緍 2296 min2 +緎 2395 yu4 +総 2893 zong3 +緐 2279 fan2 +緑绿 2799 lv4 +緒绪 2496 xu4 +緓绬 2498 ying1 +緔绱 2992 zhang4 +緕 2092 zi1 +緖 2496 xu4 +緗缃 2690 xiang1 +緘缄 2395 jian1 +緙缂 2495 ke4 +線线 2699 xian4 +緛 2198 ruan3 +緜 2229 mian2 +緝缉 2694 ji1qi1 +緞缎 2794 duan4 +緟 2291 zhong4 +締缔 2092 di4 +緡缗 2796 min2 +緢 2496 miao2 +緣缘 2793 yuan2 +緤 2499 xie4 +緥 2699 bao3 +緦缌 2693 si1 +緧 2896 qiu1 +編编 2392 bian1 +緩缓 2294 huan3 +緪 2191 geng1geng4 +緫 2793 zong3 +緬缅 2196 mian3 +緭 2692 wei4 +緮 2894 fu4 +緯纬 2495 wei3 +緰 2892 yu2 +緱缑 2798 gou1 +緲缈 2992 miao3 +緳 0029 xie2 +練练 2599 lian4 +緵 2294 zong1zong4 +緶缏 2194 bian4pian2bian3 +緷 2795 yun4 +緸 2191 yin1 +緹缇 2498 ti2 +緺 2792 gua1guo1wo1 +緻致 2894 zhi4 +緼 2691 yun1 +緽 2198 cheng1 +緾 2191 chan2 +緿 2393 dai4 +縀 2794 xia2 +縁 2793 yuan2 +縂 2893 zong3zong1 +縃 2792 xu1 +縄 2691 sheng2 +縅 2395 wei1 +縆 2191 geng1 +縇 2391 seon +縈萦 9990 ying2 +縉缙 2196 jin4 +縊缢 2891 yi4 +縋缒 2793 zhui4 +縌 2893 ni4 +縍 2092 bang1 +縎 2792 gu3 +縏 2790 pan2 +縐绉 2792 zhou4chao4cu4zhou1 +縑缣 2893 jian1 +縒 2891 cuo3 +縓 2199 quan3quan4 +縔 2799 shuang3 +縕缊 2691 yun1yun4 +縖 2396 xia2 +縗缞 2093 cui1sui1shuai1 +縘 2298 xi1 +縙 2494 rong2 +縚 2297 tao1 +縛缚 2394 fu2 +縜 2698 yun2 +縝缜 2498 chen1zhen3zhen1 +縞缟 2092 gao3 +縟缛 2194 ru4rong3 +縠 4794 hu2 +縡 2394 zai3zai4 +縢 7929 teng2 +縣县 6299 xian4xuan2 +縤 2599 su4 +縥 2499 zhen3 +縦 2898 zong4cong2zong3 +縧绦 2799 tao1 +縨 2691 huang3 +縩 2799 cai4 +縪 2694 bi4 +縫缝 2793 feng2feng4 +縬 2395 cu4 +縭缡 2092 li2 +縮缩 2396 suo1su4 +縯 2398 yin3yan3 +縰 2198 xi3 +縱纵 2898 zong4zong3 +縲缧 2699 lei2 +縳䌸 2594 zhuan4 +縴 2095 qian1qian4 +縵缦 2694 man4 +縶絷 4590 zhi2 +縷缕 2594 lv3 +縸 2498 mo4mu4 +縹缥 2199 piao3piao1 +縺 2593 lian2 +縻 0029 mi2 +縼 2898 xuan4 +總总 2693 zong3 +績绩 2598 ji1 +縿 2392 shan1 +繀 2291 sui4 +繁 8890 fan2po2 complicated 1416 +繂 2094 shuai4 +繃绷 2292 beng1beng3beng4 +繄 7790 yi1 +繅缫 2299 sao1zao3 +繆缪 2792 mou2liao3miao4miu4 +繇 2279 yao2you2zhou4yao1 +繈 2393 qiang3jiang3 +繉 2691 hun2 +繊 2395 xian1 +繋 5790 xi4 +繌 2694 zong1zong4 +繍 2592 xiu4 +繎 2393 ran2 +繏 2798 xuan4 +繐 2593 sui4hui4 +繑 2292 qiao1 +繒缯 2896 zeng1ceng2zeng4 +繓 2694 zuo3 +織织 2395 zhi1zhi4 +繕缮 2896 shan4 +繖 2894 san3 +繗 2995 lin2 +繘 2792 yu4ju2 +繙 2296 fan1fan2 +繚缭 2499 liao2rao3 +繛 5194 chuo4chao1 +繜 2894 zun1zun3 +繝 2792 jian4 +繞绕 2491 rao4rao3 +繟 2695 chan3 +繠 3390 rui3 +繡绣 2592 xiu4 +繢缋 2598 hui4hui2 +繣 2591 hua4 +繤 4490 zuan3 +繥 2496 xi1 +繦 2693 qiang3jiang3 +繧 2193 wen2 +繨 2493 da2da5 +繩绳 2791 sheng2 +繪绘 2896 hui4gui4 +繫系 5790 xi4ji4 +繬 2496 se4 +繭茧 4422 jian3 +繮缰 2191 jiang1 +繯缳 2693 huan2huan4 +繰缲 2699 qiao1sao1 +繱 2493 cong1 +繲 2795 jie4 +繳缴 2894 jiao3zhuo2jiao4he2 +繴 7090 bo4bi4 +繵 2091 chan2 +繶 2093 yi4 +繷 2593 nao2 +繸䍁 2993 sui4 +繹绎 2694 yi4shi4 +繺 2893 shai3 +繻 2192 xu1ru2 +繼继 2291 ji4 +繽缤 2398 bin1 +繾缱 2593 qian3 +繿䍀 2891 lan2 +纀 2398 pu2bu2fu2 +纁 2293 xun1 +纂 8890 zuan3zuan4 3734 +纃 2092 qi2 +纄 2493 peng2 +纅 2299 li4 +纆 2691 mo4 +纇颣 9198 lei4 +纈缬 2198 xie2 +纉 2598 zuan3 +纊纩 2098 kuang4 +纋 2194 you1 +續续 2498 xu4 +纍累 6090 lei2lei4lei3 +纎 2395 xian1 +纏缠 2091 chan2 +纐 2198 jiao3 +纑 2191 lu2 +纒 2191 chan2 +纓缨 2694 ying1 +纔 2791 cai2 +纕 2093 xiang1rang2 +纖纤 2395 xian1jian1 +纗 2292 zui1 +纘缵 2598 zuan3 +纙 2691 luo4 +纚 2191 xi3li2li3 +纛 5099 dao4du2 +纜缆 2891 lan4 +纝 2699 lei2 +纞 2293 lian4 +纟糹 2010 si1 +纠糾 2210 jiu1 1600 +纡紆 2114 yu1yu3 +红紅 2111 hong2 red 381 +纣紂 2410 zhou4 3837 +纤纖 2214 xian1jian1 1625 +纥紇 2811 he2ge1 +约約 2712 yue1 433 +级級 2714 ji2 761 +纨紈 2511 wan2 +纩纊 2010 kuang4 +纪紀 2711 ji4 596 +纫紉 2712 ren4 +纬緯 2512 wei3 2895 +纭紜 2113 yun2 +纮紘 2413 hong2 +纯純 2511 chun2 1160 +纰紕 2211 pi1pi2bi3 +纱紗 2912 sha1 2003 +纲綱 2712 gang1 2449 +纳納 2412 na4 914 +纴紝 2211 ren2ren4 +纵縱 2810 zong4zong3 vertical 1173 +纶綸 2811 lun2guan1 3356 +纷紛 2812 fen1 1041 +纸紙 2214 zhi3 paper 866 +纹紋 2014 wen2 1859 +纺紡 2012 fang3 spin 2686 +纻紵 2311 zhu4 +纼紖 2210 yin3zhen4 +纽紐 2711 niu3 2253 +纾紓 2712 shu1 +线綫 2315 xian4 line thread wire 522 +绀紺 2417 gan4 +绁紲 2411 xie4yi4 +绂紱 2314 fu2 +练練 2519 lian4 974 +组組 2711 zu3 842 +绅紳 2510 shen1 2653 +细細 2610 xi4 fine 538 +织織 2618 zhi1zhi4 weave 915 +终終 2713 zhong1 408 +绉縐 2717 zhou4 +绊絆 2915 ban4 3006 +绋紼 2512 fu2 +绌絀 2217 zhuo2chu4 +绍紹 2716 shao4 1098 +绎繹 2715 yi4 3019 +经經 2711 jing1 66 +绐紿 2316 dai4 +绑綁 2712 bang3 fasten 2064 +绒絨 2315 rong2 2618 +结結 2416 jie2jie1 junction 203 +绔絝 2412 ku4 +绕繞 2511 rao4rao3 1282 +绖絰 2111 die2 +绗絎 2112 heng4hang2 +绘繪 2813 hui4 1865 +给給 2816 gei3ji3 155 +绚絢 2712 xuan4 3458 +绛絳 2715 jiang4 3281 +络絡 2716 luo4lao4 1347 +绝絕 2711 jue2 480 +绞絞 2014 jiao3 2631 +统統 2011 tong3 500 +绠綆 2114 geng3 +绡綃 2912 xiao1 +绢絹 2612 juan4 2875 +绣綉 2212 xiu4 2007 +绤綌 2816 xi4 +绥綏 2214 sui2 3423 +绦絛 2719 tao1 +继繼 2911 ji4 631 +绨綈 2812 ti2ti4 +绩績 2518 ji1 1763 +绪緒 2416 xu4 1418 +绫綾 2414 ling2 3390 +绬緓 2418 ying1 +续續 2418 xu4 607 +绮綺 2412 qi3 2672 +绯緋 2111 fei1 3684 +绰綽 2114 chuo4chao1 2848 +绱緔 2912 zhang3 +绲緄 2611 gun3 +绳繩 2611 sheng2 rope string 1851 +维維 2011 wei2 694 +绵綿 2612 mian2 cotton 2066 +绶綬 2214 shou4 +绷綳 2712 beng1beng3beng4 3077 +绸綢 2712 chou2tao1 2385 +绹綯 2712 tao2 +绺綹 2316 liu3 +绻綣 2911 quan3 +综綜 2319 zong4zong1zeng4 2045 +绽綻 2318 zhan4 2941 +绾綰 2317 wan3 +绿綠 2719 lv4lu4 green 945 +缀綴 2714 zhui4chuo4 2582 +缁緇 2216 zi1 +缂緙 2415 ke4 +缃緗 2610 xiang1 +缄緘 2315 jian1 3902 +缅緬 2116 mian3 2622 +缆纜 2811 lan4 2768 +缇緹 2618 ti2 +缈緲 2912 miao3 +缉緝 2614 ji1qi1 2885 +缊縕 2611 yun1yun4wen1 +缋繢 2518 hui4 +缌緦 2613 si1 +缍綞 2211 duo3 +缎緞 2714 duan4 2776 +缏緶 2114 bian4pian2 +缐 2619 xian4 +缑緱 2718 gou1 +缒縋 2713 zhui4 +缓緩 2214 huan3 912 +缔締 2012 di4 3234 +缕縷 2914 lv3 2561 +编編 2312 bian1 knit 1016 +缗緡 2716 min2 +缘緣 2713 yuan2 1110 +缙縉 2116 jin4 +缚縛 2314 fu2 2486 +缛縟 2114 ru4 +缜縝 2418 zhen1zhen3 +缝縫 2713 feng2feng4 sew stitch crack 1784 +缞縗 2013 shuai1cui1 +缟縞 2012 gao3 +缠纏 2011 chan2 1828 +缡縭 2012 li2 +缢縊 2811 yi4 +缣縑 2813 jian1 +缤繽 2318 bin1 3668 +缥縹 2119 piao3piao1 3966 +缦縵 2614 man4 +缧縲 2619 lei2 +缨纓 2714 ying1 3634 +缩縮 2316 suo1su4 shrink 1187 +缪繆 2712 mou2liao3miao4miu4 2969 +缫繅 2219 sao1zao3 +缬纈 2118 xie2 +缭繚 2419 liao2 3401 +缮繕 2816 shan4 +缯繒 2816 zeng1ceng2 +缰繮 2111 jiang1 3637 +缱繾 2513 qian3 +缲繰 2619 qiao1sao1 +缳繯 2613 huan2huan4 +缴繳 2814 jiao3zhuo2 2535 +缵纘 2418 zuan3 +缶 8077 fou3 u crock +缷 8070 xie4 +缸 8171 gang1 jar 2915 +缹 8073 fou3 +缺 8578 que1 952 +缻 8171 fou3 +缼 8778 que1 +缽钵 8474 bo1 +缾 8874 ping2 +缿 8276 hou4xiang4 +罀 8371 zhao4 +罁 8772 gang1 +罂罌 7777 ying1 +罃 9977 ying1 +罄 4777 qing4 +罅 8174 xia4 +罆 8778 guan4 +罇 8874 zun1 +罈坛 2174 tan2 +罉 8975 cheng1 +罊 5777 qi4 +罋 0077 weng4 +罌罂 6677 ying1 +罍 6077 lei2 +罎 8673 tan2 +罏 8171 lu2 +罐 8471 guan4 crock 2505 +网網 7722 wang3 net mesh 935 +罒 6000 wang3 +罓 7722 gang1 +罔 7722 wang3 3716 +罕 3740 han3 2362 +罖 6030 ra +罗羅 6020 luo2 472 +罘 6090 fu2 +罙 3790 shen1 +罚罰 6072 fa2 1409 +罛 6023 gu1 +罜 6010 zhu3 +罝 6010 ju1jie1 +罞 6022 mao2 +罟 6060 gu3 +罠 6074 min2 +罡 6010 gang1 +罢罷 6073 ba4ba5pi2 cease 1192 +罣 6010 gua4 +罤 6022 ti2 +罥 6022 juan4 +罦 6040 fu2fu1 +罧 6099 lin2shen1 +罨 6071 yan3 +罩 6040 zhao4 2135 +罪 6011 zui4 722 +罫 6013 gua4guai3 +罬 6044 zhuo2 +罭 6015 yu4 +置 6071 zhi4 642 +罯 6060 an3 +罰罚 6062 fa2 +罱 6022 nan3lan3 +署 6060 shu3 1755 +罳 6033 si1 +罴羆 6033 pi2 +罵骂 6032 ma4 +罶 6060 liu3 +罷罢 6021 ba4ba5pi2 +罸 6064 fa2 +罹 6091 li2 +罺 6090 chao1 +罻 6024 wei4yu4 +罼 6050 bi4 +罽 6022 ji4 +罾 6060 zeng1 +罿 6010 tong2chong1 +羀 7760 liu3 +羁羈 6052 ji1 3241 +羂 6092 juan4 +羃 6022 mi4 +羄 6094 zhao4 +羅罗 6091 luo2 +羆罴 6033 pi2 +羇 6052 ji1 +羈羁 6052 ji1 +羉 6099 luan2 +羊 8050 yang2 u sheep 1500 +羋芈 1150 mi3mie1 +羌 8021 qiang1 3892 +羍 4050 da2 +美 8080 mei3 beauty 209 +羏 8252 yang2 +羐 1180 you3 +羑 8080 you3 +羒 8852 fen2 +羓 8751 ba1 +羔 8033 gao1 3766 +羕 8029 yang4 +羖 8754 gu3 +羗 8051 qiang1 +羘 7825 zang1 +羙 8080 mei3gao1 +羚 8853 ling2 +羛 8052 yi4xi4 +羜 8352 zhu4 +羝 8254 di1di3 +羞 8021 xiu1 1754 +羟羥 8751 qian1qiang3 +羠 8558 yi2 +羡 8018 xian4 2512 +羢 8355 rong2 +羣 1750 qun2 +群 1865 qun2 flock 481 +羥羟 8151 qiang3qian1 +羦 8351 huan2 +羧 8354 suo1zui1 +羨 8018 xian4 +義义 8055 yi4 +羪 8353 you1 +羫 8351 qiang1 +羬 8355 xian2 +羭 8852 yu2 +羮 8080 geng1 +羯 8652 jie2 +羰 8258 tang1 +羱 8159 yuan2 +羲 8025 xi1 3882 +羳 8256 fan2 +羴 8055 shan1 +羵 8458 fen3 +羶 8051 shan1 +羷 8858 lian3 +羸 0021 lei2lian2 +羹 8080 geng1 3246 +羺 8152 nou2 +羻 8054 qiang4 +羼 7725 chan4 +羽 1712 yu3hu4 u 1611 +羾 1111 gong4 +羿 1744 yi4 +翀 1510 chong1chong2 +翁 8012 weng1weng3 1855 +翂 1822 fen1 +翃 0772 hong2 +翄 1414 chi4 +翅 4740 chi4 2566 +翆 1740 cui4 +翇 1740 fu2 +翈 6752 xia2 +翉 5702 pen3 +翊 0712 yi4 3853 +翋 1011 la1la4 +翌 1710 yi4 3419 +翍 1424 pi1 +翎 8732 ling2 3267 +翏 1720 liu4liao4liu2 +翐 1518 zhi4 +翑 1712 qu2 +習习 1760 xi2 +翓 4762 xie2 +翔 8752 xiang2 1937 +翕 8012 xi4 +翖 8762 xi4 +翗 2722 qi2 +翘翹 5721 qiao2qiao4 2926 +翙 2722 hui4 +翚 1750 hui1 +翛 2722 xiao1shu4 +翜 1780 se4sha4 +翝 3772 hong2 +翞 1019 jiang1 +翟 1721 di2zhai2 3384 +翠 1740 cui4 1588 +翡 1122 fei3 3533 +翢 7722 tao1 +翣 1740 sha4 +翤 6722 chi4 +翥 4412 zhu4 +翦 8012 jian3 +翧 3712 xuan1 +翨 1780 shi4chi4 +翩 1722 pian1 2675 +翪 1214 zong1 +翫 1161 wan4wan1 +翬翚 1750 hui1 +翭 1718 hou2 +翮 1722 he2li4 +翯 1722 he4he2 +翰 4842 han4 2112 +翱 2742 ao2 +翲 1792 piao1 +翳 7712 yi4 +翴 1513 lian2 +翵 1712 qu2 +翶 2742 ao2 +翷 9722 lin2 +翸 0782 pen3 +翹翘 4721 qiao2qiao4 +翺 2742 ao2 +翻 2762 fan1 reverse 803 +翼 1780 yi4 1606 +翽翙 2722 hui4 +翾 6772 xuan1 +翿 4762 dao4 +耀 9721 yao4 1803 +老 4471 lao3 u old 190 +耂 4400 lao3 +考 4402 kao3 588 +耄 4471 mao4 +者 4460 zhe3zhu1 114 +耆 4460 qi2shi4zhi3 +耇 4462 gou3 +耈 4462 gou3 +耉 4462 gou3 +耊 4410 die4 +耋 4410 die4 +而 1022 er2 u while 40 +耍 1040 shua3 2388 +耎 1080 ruan3 +耏 1222 er2nai4 +耐 1420 nai4neng2 1476 +耑 2222 zhuan1duan1 +耒 5090 lei3 u +耓 5192 ting1 +耔 5794 zi3 +耕 5590 geng1 2011 +耖 5992 chao4 +耗 5291 hao4 1836 +耘 5193 yun2 3715 +耙 5791 ba4pa2 +耚 5494 pi1 +耛 5396 chi2 +耜 5797 si4 +耝 5791 chu2 +耞 5690 jia1 +耟 5791 ju4 +耠 5896 he2huo1 +耡 5492 chu2 +耢耮 5492 lao4 +耣 5892 lun3 +耤 5496 ji2jie4 +耥 5992 tang3 +耦 5692 ou3 +耧耬 5994 lou2 +耨 5194 nou4 +耩 5595 jiang3gou1 +耪 5092 pang3 +耫 5598 ze2 +耬耧 5594 lou2lou3 +耭 5295 ji1 +耮耢 5992 lao4 +耯 5494 huo4 +耰 5194 you1 +耱 5096 mo4 +耲 5093 huai2 +耳 1040 er3 u 838 +耴 1241 zhe2 +耵 1142 ding1 +耶 1742 ye2ye1 1716 +耷 4040 da1zhe2 +耸聳 8840 song3 2229 +耹 1842 qin2 +耺 1143 yun2 +耻恥 1141 chi3 2175 +耼 1745 dan1 +耽 1441 dan1 2437 +耾 1443 hong2 +耿 1948 geng3 2423 +聀 1345 zhi2zhi4 +聁 1842 u1 +聂聶 1044 nie4 2481 +聃 1544 dan1 +聄 1842 zhen3 +聅 1848 che4 +聆 1843 ling2 3229 +聇 1141 zheng1 +聈 1442 you3 +聉 1242 wa1 +聊 1742 liao2 1624 +聋聾 4340 long2 deaf 2835 +职職 1648 zhi2 744 +聍聹 1342 ning2ning3 +聎 1341 tiao1 +聏 1142 er2 +聐 1446 ya4 +聑 1144 die2 +聒 1246 gua1guo1 +聓 1740 xu4 +联聯 1848 lian2 590 +聕 1446 hao4 +聖圣 1610 sheng4 +聗 1448 lie4 +聘 1542 pin4ping4 2166 +聙 1542 jing1 +聚 1723 ju4 1099 +聛 1644 bi4 +聜 1341 di3 +聝 1345 guo2 +聞闻 7740 wen2 +聟 8640 xu4 +聠 1844 ping2 +聡 1843 cong1 +聢 1348 ding4 +聣 1741 ni2 +聤 1042 ting2 +聥 1242 yu3 +聦 1743 cong1 +聧 1248 kui2 +聨 1244 lian2 +聩聵 1548 kui4 +聪聰 1843 cong1 1623 +聫 1248 lian2 +聬 1842 weng3 +聭 1641 kui4 +聮 1243 lian2 +聯联 1247 lian2 +聰聪 1643 cong1 +聱 5840 ao2 +聲声 4740 sheng1 +聳耸 2840 song3 +聴 1443 ting1 +聵聩 6548 kui4 +聶聂 1044 nie4 +職职 1345 zhi2 +聸 1746 dan1 +聹聍 1342 ning2 +聺 1349 qie2 +聻 3240 jian4 +聼 1443 ting1 +聽听 1413 ting1 +聾聋 0140 long2 +聿 5000 yu4 u 3940 +肀 5000 yu4 +肁 3025 zhao4 +肂 1520 si4 +肃肅 5022 su4 1455 +肄 2580 yi4 +肅肃 5022 su4 +肆 7570 si4ti4 four 2363 +肇 3850 zhao4 2974 +肈 3350 zhao4 +肉 4022 rou4 u meat 967 +肊 7721 yi4 +肋 7422 lei4le4 3235 +肌 7721 ji1 2172 +肍 7421 qiu2 +肎 3722 ken3 +肏 8022 cao4 fuck 500 +肐 7821 ge1 +肑 7722 di4 +肒 7521 huan2 +肓 0022 huang1 +肔 7421 yi3 +肕 7722 ren4 +肖 9022 xiao1xiao4 2116 +肗 7424 ru3 +肘 7420 zhou3 2892 +肙 6022 yuan1 +肚 7421 du4 1563 +肛 7121 gang1 +肜 7222 rong2chen1 +肝 7124 gan1 2305 +肞 7420 chai1 +肟 7122 wo4 +肠腸 7722 chang2 intestines 1941 +股 7724 gu3 884 +肢 7424 zhi1shi4 2498 +肣 7822 han2 +肤膚 7528 fu1 skin 1979 +肥 7721 fei2bi3 1618 +肦 7822 fen2ban1 +肧 7129 pei1 +肨 7520 pang4 +肩 3022 jian1xian2 1236 +肪 7022 fang2 3901 +肫 7521 zhun1chun2 +肬 7321 you2 +肭 7422 na4nv4 +肮骯 7021 ang1 dirty 3563 +肯 2122 ken3 755 +肰 7328 ran2 +肱 7423 gong1 +育 0022 yu4yo1 975 +肳 7722 wen3 +肴餚 4022 yao2 3100 +肵 7222 jin4qi2 +肶 7221 pi2 +肷 7728 qian3 +肸 7824 xi1 +肹 7822 xi1bi4 +肺 7522 fei4 lung 2534 +肻 2122 ken3 +肼 7520 jing3 +肽 7423 tai4 +肾腎 2722 shen4 kidney 3621 +肿腫 7520 zhong3 swollen 2216 +胀脹 7223 zhang4 2345 +胁脅 7423 xie2 1923 +胂 7520 shen4 +胃 6022 wei4 stomach 2473 +胄 5022 zhou4 3987 +胅 7528 die2 +胆膽 7621 dan3 1276 +胇 7522 fei4 +胈 7324 ba2 +胉 7620 bo2 +胊 7722 qu2 +胋 7126 tian2 +背 1222 bei4bei1 back 661 +胍 7223 gua1gu1hu4 +胎 7326 tai1 2262 +胏 7522 zi3fei4 +胐 7227 ku1pei2 +胑 7628 zhi1 +胒 7721 ni4 +胓 7124 ping2 +胔 2222 zi4 +胕 7420 fu4fu2fu1 +胖 7925 pang4pan2pan4 1943 +胗 7822 zhen1 +胘 7023 xian2 +胙 7821 zuo4 +胚 7121 pei1 3768 +胛 7625 jia3 +胜勝 7521 sheng4 win 736 +胝 7224 zhi1chi1di4 +胞 7721 bao1 1914 +胟 7725 mu3 +胠 7423 qu1 +胡衚 4762 hu2 709 +胢 7122 ke1 +胣 7821 yi3chi3 +胤 2201 yin4 +胥 1722 xu1xu3 3588 +胦 7528 yang1 +胧朧 7321 long2 2994 +胨腖 7429 dong4 +胩 7123 ka3 +胪臚 7120 lu2 +胫脛 7721 jing4 +胬 4722 nu3nu2 +胭 7620 yan1 3725 +胮 7725 pang2 +胯 7422 kua4kua3 +胰 7528 yi2 +胱 7921 guang1 +胲 7028 hai3 +胳 7726 ge1ge2ga1 2748 +胴 7722 dong4 +胵 7121 zhi4chi1 +胶膠 7024 xiao2jiao1jiao3 glue 2358 +胷 2722 xiong1 +胸 7722 xiong1 chest bosom 1297 +胹 7122 er2 +胺 7324 e4an4 +胻 7122 xing2heng2 +胼 7824 pian2 +能 2221 neng2 34 +胾 4325 zi4 +胿 7421 gui1kui4 +脀 1722 cheng2zheng1 +脁 7221 tiao4tiao3 +脂 7226 zhi1zhi3 2466 +脃 2721 cui4 +脄 2428 mei2 +脅胁 4022 xie2 +脆 7721 cui4 1976 +脇 7422 xie2 +脈脉 7229 mai4mo4 +脉脈 7329 mai4mo4 1796 +脊 3222 ji2 2164 +脋 1722 xie2 +脌 7825 nin2 +脍膾 7823 kuai4 +脎 7429 sa4 +脏臟 7021 zang4 1838 +脐臍 7022 qi2 3877 +脑腦 7027 nao3 brain 686 +脒 7929 mi3 +脓膿 7423 nong2 pus 3947 +脔臠 0022 luan2 +脕 7721 wan3 +脖 7424 bo2 2381 +脗 7726 wen3 +脘 7321 wan3 +脙 7329 qiu2 +脚腳 7722 jiao3 foot feet 630 +脛胫 7121 jing4 +脜 7126 rou2 +脝 7022 heng1 +脞 7821 cuo3 +脟 7224 lie4 +脠 7224 shan1 +脡 7224 ting3 +脢 7825 mei2 +脣 7122 chun2 +脤 7123 shen4 +脥 7428 qian3 +脦 7324 te4 +脧 7324 juan1 +脨 7529 cu4 +脩 2822 xiu1tiao2 +脪 7422 xin4 +脫脱 7821 tuo1tui4 +脬 7214 pao1bao1 +脭 7621 cheng2 +脮 7224 nei3 +脯 7322 fu3pu2 3207 +脰 7121 dou4 +脱脫 7821 tuo1 802 +脲 7729 niao4 +脳 7927 nao3 +脴 7126 pi3 +脵 7628 gu3 +脶腡 7622 gua1luo2 +脷 7220 li4 +脸臉 7821 lian3 face 585 +脹胀 7123 zhang4chang2 +脺 7024 cui4 +脻 7528 jie2 +脼 7122 liang3 +脽 7021 zhou1shui2 +脾 7624 pi2 2300 +脿 7523 biao1biao4biao3 +腀 7822 lun2 +腁 7224 pian2 +腂 7629 guo4 +腃 7922 juan4 +腄 7221 chui2 +腅 7928 dan4 +腆 7528 tian3 3784 +腇 7224 nei3 +腈 7522 jing1 +腉 7721 jie1 +腊臘 7426 la4 2249 +腋 7024 yi4ye4 3909 +腌 7421 yan1 3913 +腍 7823 ren3ren4 +腎肾 7722 shen4 +腏 7724 chuo4zhui4 +腐 0022 fu3 1731 +腑 7024 fu3 3230 +腒 7726 ju1 +腓 7121 fei2 +腔 7321 qiang1kong4 2089 +腕 7321 wan4 2369 +腖胨 7529 dong4 +腗 7522 pi2 +腘 7620 guo2 +腙 7329 zong1 +腚 7328 ding4 +腛 7721 wu1 +腜 7429 mei2 +腝 7128 ruan3 +腞 7723 zhuan4 +腟 7321 zhi4 +腠 7528 cou4 +腡脶 7722 gua1luo2 +腢 7622 ou3 +腣 7022 di4 +腤 7026 an1 +腥 7621 xing1 2933 +腦脑 7226 nao3nao4 +腧 2822 yu2shu4 +腨 7222 chuan3 +腩 7422 nan3 +腪 7725 yun4 +腫肿 7221 zhong3 +腬 7729 rou2 +腭齶 7622 e4 +腮 7623 sai1 3300 +腯 7226 tu2 +腰 7124 yao1 waist 1373 +腱 7524 jian4qian2 +腲 7623 wei3 +腳脚 7722 jiao3 +腴 7728 yu2 +腵 7724 jia1 +腶 7724 duan4 +腷 7126 bi4 +腸肠 7622 chang2 +腹 7824 fu4 belly 1809 +腺 7629 xian4 +腻膩 7324 ni4 2656 +腼靦 7126 mian3 +腽膃 7621 wa4 +腾騰 7922 teng2 1782 +腿 7723 tui3 leg 1305 +膀 7022 bang3 2140 +膁 7823 qian1lian2 +膂 0822 lv3 +膃腽 7621 wa4 +膄 7724 sou4 +膅 7026 tang2 +膆 7529 su4 +膇 7723 zhui4 +膈 7122 ge2 +膉 7821 yi4 +膊 7324 bo2po4lie4 2745 +膋 9922 liao2 +膌 7422 ji2 +膍 7621 pi2 +膎 7228 xie2 +膏 0022 gao1gao4 2695 +膐 0822 lv3 +膑臏 7328 bin4 +膒 7121 ou1 +膓 7822 chang2 +膔 7021 lu4 +膕腘 7620 guo2 +膖 7723 pang1 +膗 7221 chuai2 +膘 7129 piao3biao1 +膙 7323 jiang3 +膚肤 2122 fu1 +膛 7921 tang2tang1 2813 +膜 7428 mo4mo2 2643 +膝 7429 xi1 2188 +膞 7504 zhuan1chun2 +膟 7024 lv4 +膠胶 7722 jiao1jiao3 +膡 7926 ying4 +膢 7524 lv2liu2lou2 +膣 7321 zhi4 +膤 7127 xue3 +膥 5322 chun1 +膦 7925 lian3lin4 +膧 7021 tong2 +膨 7222 peng2peng4 2935 +膩腻 7324 ni4 +膪 7026 zha4zhai4 +膫 2429 liao2 +膬 7221 cui4 +膭 7528 gui1 +膮 7421 xiao1 +膯 7221 teng1 +膰 7226 fan2 +膱 7325 zhi2zhu1 +膲 7023 jiao1 +膳 7826 shan4 3143 +膴 7823 hu1wu3mei2wu2 +膵 7424 cui4 +膶 7722 run4 +膷 7722 xiang1 +膸 7423 sui3 +膹 7428 fen4 +膺 0022 ying1 3614 +膻 7021 dan4shan1tan3 +膼 7723 zhua1 +膽胆 7726 dan3 +膾脍 7826 kuai4 +膿脓 7523 nong2 +臀 7722 tun2 3615 +臁 7023 lian2 +臂 7022 bi4bei5bei4 arm 1378 +臃 7021 yong3yong1 +臄 7123 jue2 +臅 7622 chu4 +臆 7023 yi4yi3 3897 +臇 7022 juan3 +臈 7422 la4 +臉脸 7828 lian3 +臊 7629 sao1sao4 +臋 7722 tun2 +臌 7424 gu3 +臍脐 7022 qi2 +臎 7724 cui4 +臏膑 7328 bin4 +臐 7223 xun1 +臑 7122 nao4 +臒 7424 huo4 +臓 7425 zang4 +臔 7728 xian4 +臕 7023 biao1 +臖 7722 xing4 +臗 7321 kuan1 +臘腊 7221 la4 +臙 7423 yan1 +臚胪 7121 lu2 +臛 7121 huo4 +臜臢 7428 za1 +臝 0021 luo3 +臞 7621 qu2 +臟脏 7425 zang4 +臠脔 2222 luan2 +臡 4022 ni2 +臢臜 7428 za1 +臣 7171 chen2 u 1344 +臤 7774 qian1 +臥 7870 wo4 +臦 1111 guang4 +臧 2325 zang1cang2zang4 3754 +臨临 7876 lin2 +臩 1122 guang4 +自 2600 zi4 u 42 +臫 2261 jiao3 +臬 2690 nie4 +臭 2680 chou4xiu4 1952 +臮 2688 ji4 +臯 2640 gao1 +臰 2621 chou4 +臱 2622 mian2 +臲 2791 nie4 +至 1010 zhi4 u 214 +致 1814 zhi4 521 +臵 1716 ge2 +臶 1414 jian4zun4 +臷 4315 die2 +臸 1111 zhi4 +臹 1315 xiu1 +臺台 4010 tai2 +臻 1519 zhen1 3196 +臼 7777 jiu4 u 3963 +臽 2777 xian4 +臾 7780 yu2 3643 +臿 1077 cha1 +舀 2077 yao3 +舁 7744 yu2 +舂 5077 chong1 +舃 7732 xi4 +舄 7732 xi4 +舅 7742 jiu4 uncle 2096 +舆輿 7780 yu2 2442 +與与 7780 yu3yu4yu2 +興兴 7780 xing1xing4 +舉举 7750 ju3 +舊旧 4477 jiu4 +舋 7710 xin4 +舌 2060 she2 u 1947 +舍捨 8060 she4 1048 +舎 8060 she4 +舏 2260 jiu3 +舐 2264 shi4 +舑 1565 tan1 +舒 8762 shu1 1271 +舓 1662 shi4 +舔 2263 tian3 3783 +舕 2968 tan4 +舖 8362 pu4 +舗 8362 pu4 +舘 8367 guan3 +舙 2066 hua4 +舚 2766 tan1tian4 +舛 2520 chuan3 u +舜 2025 shun4 2655 +舝 4050 xia2 +舞 8025 wu3 dance 902 +舟 2744 zhou1 u 1814 +舠 2742 dao1 +舡 2141 chuan2 +舢 2247 shan1 +舣艤 2440 yi3 +舤 2741 fan2 +舥 2741 pa1 +舦 2443 tai4 +舧 2341 fan2 +舨 2244 ban3 +舩 2843 chuan2 +航 2041 hang2 1501 +舫 2042 fang3 3860 +般 2744 ban1 503 +舭 2241 que4bi3 +舮 2340 lu2 +舯 2540 zhong1 +舰艦 2741 jian4 2689 +舱艙 2841 cang1 2281 +舲 2843 ling2 +舳 2546 zhu2 +舴 2841 ze2 +舵 2341 duo4tuo2 3290 +舶 2640 bo2 3331 +舷 2043 xian2 3859 +舸 2142 ge3 +船 2846 chuan2 boat ship 721 +舺 2645 xia2jia2jia3 +舻艫 2140 lu3lu2 +舼 2448 hong2 +舽 2745 pang2 +舾 2146 xi1 +舿 2442 kua1 +艀 2244 fu2 +艁 2446 zao4 +艂 2745 feng2 +艃 2641 li2 +艄 2942 shao1 +艅 2849 yu2 +艆 2343 lang2 +艇 2244 ting3 2673 +艈毓 2041 yu4 +艉 2741 wei3 +艊 2642 bo2 +艋 2741 meng3 +艌 2843 nian4 +艍 2746 ju1 +艎 2641 huang2 +艏 2846 shou3 +艐 2244 zong1 +艑 2342 bian4 +艒 2646 mu4 +艓 2449 die2 +艔 2044 dao4 +艕 2042 bang4 +艖 2841 cha1 +艗 2841 yi4 +艘 2744 sou1 2786 +艙舱 2846 cang1 +艚 2546 cao2 +艛 2544 lou2 +艜 2442 dai4 +艝 2147 xue3 +艞 2841 yao4 +艟 2041 chong1 +艠 2241 deng1 +艡 2946 dang1 +艢 2446 qiang2 +艣 2746 lu3 +艤舣 2845 yi3 +艥 2345 jie4 +艦舰 2841 jian4 +艧 2444 huo4 +艨 2443 meng2 +艩 2042 qi2 +艪 2746 lu3 +艫舻 2141 lu2lu3 +艬 2741 chan2 +艭 2044 shuang1 +艮 7773 gen4 u +良 3073 liang2 644 +艰艱 7743 jian1 1689 +艱艰 4753 jian1 +色 2771 se4 u color 223 +艳艷 5701 yan4 1643 +艴 5701 fu2 +艵 8741 ping2 +艶 5711 yan4 +艷艳 5711 yan4 +艸 2244 cao3zao4 u +艹 4400 ao3 +艺藝 4471 yi4 art 797 +艻 4442 le4ji2 +艼 4420 ting1ding3 +艽 4441 jiao1qiu2 +艾 4440 ai4yi4 1557 +艿 4422 nai3 +芀 4422 tiao2 +芁 4421 jiao1 +节節 4422 jie2jie1 455 +芃 4421 peng2 +芄 4451 wan2 +芅 4404 yi4 +芆 4440 chai1 +芇 4422 mian2 +芈羋 1150 mie1mi3 +芉 4440 gan1 +芊 4440 qian1qian4 +芋 4440 yu4 3953 +芌 4402 yu4 +芍 4412 shao2 +芎 4402 xiong1 +芏 4410 tu3du4 +芐 4423 xia4hu4 +芑 4471 qi3 +芒 4471 mang2 2095 +芓 4440 zi3zi4 +芔 2244 hui3hui4 +芕 4420 sui1 +芖 4480 zhi4 +芗薌 4420 xiang1 +芘 4471 pi2bi1 +芙 4480 fu2 2361 +芚 4471 tun2chun1 +芛 4450 wei3 +芜蕪 4441 wu2 3106 +芝 4430 zhi1 1825 +芞 4401 qi3 +芟 4440 shan1 +芠 4440 wen2 +芡 4480 qian4 +芢 4421 ren2 +芣 4490 fu2 +芤 4441 kou1 +芥 4422 jie4gai4 3656 +芦蘆 4420 lu2 2397 +芧 4440 xu4zhu4 +芨 4424 ji1 +芩 4420 qin2yin2 +芪 4474 qi2chi2 +芫 4421 yuan2yan2 +芬 4422 fen1fen2 1869 +芭 4471 ba1pa1 3036 +芮 4422 rui4ruo4 3385 +芯 4433 xin1xin4 2893 +芰 4440 ji4 +花 4421 hua1 flower 305 +芲 4471 hua1 +芳 4422 fang1 1072 +芴 4422 wu4hu1 +芵 4480 jue2 +芶 4472 gou1 +芷 4410 zhi3 3213 +芸蕓 4473 yun2 2841 +芹 4422 qin2 3382 +芺 4480 ao3 +芻刍 2742 chu2 +芼 4471 mao4mao2 +芽 4424 ya2 2696 +芾 4422 fei4fu4fu2 +芿 4422 reng4 +苀 4421 hang2 +苁蓯 4488 cong1 +苂 4480 yin2 +苃 4440 you3 +苄 4423 bian4 +苅 4442 yi4 +苆 4472 qie1 +苇葦 4452 wei3 3127 +苈藶 4422 li4 +苉 4471 pi3 +苊 4421 e4 +苋莧 4421 xian4huan2 +苌萇 4473 chang2 +苍蒼 4471 cang1cang3 1584 +苎苧 4410 meng2zhu4 +苏蘇 4433 su1 720 +苐 4422 yi2ti2di4 +苑 4421 yuan4 2550 +苒 4455 ran3 +苓 4430 ling2lian2 3777 +苔 4460 tai2tai1 3168 +苕 4460 tiao2shao2 +苖 4460 di3 +苗 4460 miao2 1846 +苘 4422 qiong3qing3 +苙 4410 li4 +苚 4422 yong4 +苛 4462 ke1he1he2 3086 +苜 4460 mu4 +苝 4411 pei4 +苞 4471 bao1pao2biao1 3410 +苟 4462 gou3gou1 2587 +苠 4474 min2 +苡 4418 yi3si4 +苢 4477 yi3 +苣 4471 ju4qu3 +苤 4410 pi1pie3pi3 +若 4460 ruo4re3re2re4 432 +苦 4460 ku3gu3 543 +苧苎 4420 zhu4ning2 +苨 4421 ni3 +苩 4460 bo2 +苪 4422 bing3 +苫 4460 shan1shan4 +苬 4460 qiu2 +苭 4472 yao3 +苮 4427 xian1 +苯 4423 ben3 +苰 4423 hong2 +英 4480 ying1yang1 434 +苲 4481 zha3zha4zuo2 +苳 4430 dong1 +苴 4410 ju1cha2 +苵 4480 die2 +苶 4490 nie2 +苷 4477 gan1 +苸 4440 hu1 +苹蘋 4440 ping2peng1 apple 2233 +苺 4450 mei2mei4 +苻 4424 fu2pu2 +苼 4410 sheng1 +苽 4423 gu1 +苾 4433 bi4 +苿 4490 wei4 +茀 4452 fu2 +茁 4477 zhuo2 +茂 4425 mao4 2171 +范範 4411 fan4 770 +茄 4446 qie2jia1 3116 +茅 4422 mao2 2232 +茆 4472 mao3mao2 +茇 4440 ba2 +茈 4411 zi3 +茉 4490 mo4 3787 +茊 4410 zi1ci2 +茋 4474 di3 +茌 4421 chi2 +茍 4462 ji4 +茎莖 4410 jing1 stalk 3539 +茏蘢 4441 long2 +茐 4442 cong1 +茑蔦 4412 niao3 +茒 4422 yuan2 +茓 4480 xue2 +茔塋 4410 ying2 +茕煢 4441 qiong2 +茖 4460 ge4 +茗 4460 ming2 3834 +茘 4422 li4 +茙 4445 rong2 +茚 4472 yin4 +茛 4473 gen4jian4 +茜 4460 qian4qian1xi1 3163 +茝 4471 chai3zhi3 +茞 4471 chen2 +茟 4450 yu4 +茠 4429 xiu1hao1 +茡 4440 zi4 +茢 4422 lie4 +茣 4480 wu2 +茤 4420 ji4duo1 +茥 4410 gui1 +茦 4490 ce4 +茧繭 4413 jian3 cocoon 3337 +茨 4418 ci2 2982 +茩 4426 gou3hou4 +茪 4421 guang1 +茫 4411 mang2 1853 +茬 4421 cha2 3866 +茭 4440 jiao1 +茮 4490 jiao1 +茯 4428 fu2 +茰 4450 yu2 +茱 4490 zhu1 +茲兹 4473 zi1 +茳 4411 jiang1 +茴 4460 hui2 +茵 4460 yin1 2571 +茶 4490 cha2 tea 981 +茷 4425 fa2fei4 +茸 4440 rong2 3701 +茹 4446 ru2 3118 +茺 4421 chong1 +茻 2244 mang3 +茼 4422 tong2 +茽 4425 zhong4 +茾 4444 qian1 +茿 4411 zhu2 +荀 4462 xun2 3653 +荁 4410 huan2 +荂 4412 kua1 +荃 4410 quan2chuo4 +荄 4480 gai1 +荅 4460 da1da2ta4 +荆荊 4240 jing1 2314 +荇 4422 xing4 +荈 4425 chuan3quan4 +草 4440 cao3 grass 708 +荊荆 4440 jing1 +荋 4422 er2 +荌 4440 an4 +荍 4474 shou1qiao2 +荎 4410 chi2 +荏 4421 ren3 +荐薦 4424 jian4 2144 +荑 4480 ti2yi2 +荒 4421 huang1 1440 +荓 4444 ping2ping1 +荔 4422 li4 3527 +荕 4422 jin1 +荖 4471 lao3 +荗 4425 shu4 +荘 4411 zhuang1 +荙薘 4430 da2 +荚莢 4480 jia2 +荛蕘 4421 rao2 +荜蓽 4440 bi4 +荝 4482 ze2ce4 +荞蕎 4422 qiao2 +荟薈 4473 hui4 +荠薺 4422 ji4 +荡盪 4412 dang4 1319 +荢 4440 zi4 +荣榮 4490 rong2 glory honor 965 +荤葷 4450 hun1xun1 3862 +荥滎 4490 ying2 +荦犖 4450 luo4 +荧熒 4480 ying2 3255 +荨蕁 4434 xun2qian2 +荩藎 4430 jin4 +荪蓀 4449 sun1 3561 +荫蔭 4422 yin4yin1 shade 2357 +荬蕒 4480 mai3 +荭葒 4411 hong2 +荮葤 4414 zhou4 +药葯 4412 yao4yue4 medicine 656 +荰 4491 du4 +荱 4421 wei3 +荲 4410 chu4 +荳 4410 dou4 +荴 4458 fu1 +荵 4433 ren3 +荶 4462 yin2 +荷 4422 he2 1508 +荸 4440 bi2bo2 +荹 4420 bu4 +荺 4412 yun3 +荻 4428 di2 +荼 4490 tu2 3876 +荽 4440 sui1 +荾 4440 sui1 +荿 4425 cheng2 +莀 4423 chen2 +莁 4410 wu2 +莂 4442 bie2 +莃 4422 xi1 +莄 4450 geng3 +莅蒞 4421 li4 +莆 4422 fu3pu2 +莇 4412 zhu4 +莈 4434 mo4 +莉 4492 li4 2367 +莊庄 4421 zhuang1 +莋 4421 ji2zuo2 +莌 4421 duo2tuo4 +莍 4429 qiu2 +莎 4412 sha1suo1sui1 2375 +莏 4452 suo1 +莐 4411 chen2 +莑 4450 feng1 +莒 4460 ju3 +莓 4450 mei2mei4 +莔 4460 meng2 +莕 4460 xing4 +莖茎 4410 jing1ying1 +莗 4450 che1 +莘 4440 shen1xin1 +莙 4460 jun1 +莚 4440 yan2 +莛 4440 ting2ting3 +莜 4424 you2 +莝 4410 cuo4 +莞 4421 guan1guan3wan3 3436 +莟 4460 han4 +莠 4422 you3xiu4 +莡 4480 cuo4 +莢荚 4490 jia2 +莣 4433 wang2 +莤 4460 you2 +莥 4421 niu3 +莦 4422 shao1 +莧苋 4421 xian4huan2wan4 +莨 4473 lang2lang4liang2 +莩 4440 fu2piao3 +莪 4455 e2 +莫 4480 mo4mu4 731 +莬 4441 wen4wan3mian3 +莭 4472 jie2 +莮 4442 nan2 +莯 4439 mu4 +莰 4418 kan3 +莱萊 4490 lai2 1529 +莲蓮 4430 lian2 1433 +莳蒔 4464 shi2shi4 +莴萵 4422 wo1 +莵 4441 tu4tu2 +莶薟 4410 xian1lian2 +获獲 4428 huo4 901 +莸蕕 4421 you2 +莹瑩 4410 ying2 2519 +莺鶯 4412 ying1 2802 +莻 4461 neus +莼蒓 4411 chun2 +莽 4444 mang3 2808 +莾 4444 mang3 +莿 4492 ci4 +菀 4421 wan3yun4 +菁 4422 jing1 3593 +菂 4462 di1di4 +菃 4411 qu2 +菄 4490 dong1 +菅 4477 jian1guan1 +菆 4414 zou1 +菇 4446 gu1 3752 +菈 4451 la1 +菉 4429 lu4 +菊 4492 ju2 2058 +菋 4469 wei4 +菌 4460 jun1jun4 2886 +菍 4433 nie4 +菎 4471 kun1jun4 +菏 4412 he2ge1 +菐 2380 pu2 +菑 4460 zi1zai1zi4 +菒 4490 gao3 +菓 4490 guo3 +菔 4424 fu2bo2 +菕 4422 lun2lun4 +菖 4460 chang1 +菗 4456 chou2 +菘 4493 song1 +菙 4410 chui2 +菚 4450 zhan4 +菛 4422 men2 +菜 4490 cai4 943 +菝 4454 ba2bi4 +菞 4492 li2 +菟 4441 tu4tu2 +菠 4414 bo1 +菡 4477 han4 +菢 4411 bao4 +菣 4474 qin4 +菤 4471 juan3 +菥 4492 xi1si1 +菦 4430 qin2 +菧 4424 di3 +菨 4440 jie1 +菩 4460 pu2bei4bu4bo2 2860 +菪 4460 dang4 +菫 4410 jin3jin4qin2 +菬 4416 zhao3 +菭 4416 tai2 +菮 4428 geng1 +華华 4450 hua2hua1hua4 +菰 4443 gu1 +菱 4440 ling2 2600 +菲 4411 fei1fei3fei4 1887 +菳 4410 jin1 +菴 4471 an1an3 +菵 4422 wang3 +菶 4450 beng3peng2 +菷 4422 zhou3 +菸 4423 yan1yu1yu4 +菹 4411 ju1zu1ju4 +菺 4422 jian1 +菻 4499 lin3ma2 +菼 4480 tan3 +菽 4494 shu2 +菾 4433 tian2 +菿 4412 dao4 +萀 4421 hu3 +萁 4480 qi2ji1 +萂 4496 he2 +萃 4440 cui4 3221 +萄 4472 tao2 2687 +萅 4460 chun1 +萆 4440 pi4 +萇苌 4473 chang2 +萈 4421 huan2 +萉 4421 fei2 +萊莱 4490 lai2 +萋 4440 qi1 +萌 4462 meng2 2807 +萍 4414 ping2 1960 +萎 4440 wei3 2976 +萏 4477 dan4 +萐 4480 sha4 +萑 4421 huan2 +萒 4421 yan3 +萓 4410 yi2 +萔 4456 tiao2 +萕 4422 qi2 +萖 4421 wan3 +萗 4490 ce4 +萘 4490 nai4 +萙 4491 zhen3 +萚 4455 tuo4 +萛 4444 jiu1 +萜 4426 tie1 +萝蘿 4420 luo2 radish 2678 +萞 4471 bi4 +萟 4491 yi4 +萠 4422 meng2 +萡 4416 bo2 +萢 4411 pao1 +萣 4480 ding4 +萤螢 4413 ying2 3430 +营營 4460 ying2 763 +萦縈 4490 ying2 3457 +萧蕭 4422 xiao1 1764 +萨薩 4420 sa4 1356 +萩 4498 qiu1 +萪 4494 ke1 +萫 4460 xiang4 +萬万 4442 wan4 +萭 4422 yu3ju3 +萮 4422 yu4 +萯 4480 fu4 +萰 4490 lian4 +萱 4410 xuan1 3582 +萲 4440 xuan1 +萳 4422 nan2 +萴荝 4482 ze2ce4 +萵莴 4422 wo1 +萶 4460 chun3 +萷 4422 xiao1 +萸 4480 yu2 +萹 4422 bian1 +萺 4460 mao4 +萻 4460 an1 +萼 4420 e4 +落 4416 luo4la4lao4 367 +萾 4410 ying2 +萿 4416 huo2 +葀 4456 gua1 +葁 4440 jiang1 +葂 4421 mian3 +葃 4461 zuo2 +葄 4421 zuo4 +葅 4481 ju1zu1 +葆 4429 bao3 3750 +葇 4490 rou2 +葈 4490 xi3 +葉叶 4490 ye4xie2 +葊 4444 an1 +葋 4422 qu2 +葌 4444 jian1 +葍 4460 fu2 +葎 4425 lv4 +葏 4415 jing1 +葐 4410 pen2 +葑 4414 feng1feng4 +葒荭 4491 hong2 +葓 4418 hong2 +葔 4428 hou2 +葕 4422 yan2 +葖 4480 tu2tu1 +著着 4460 zhu4 726 +葘 4460 zi1 +葙 4496 xiang1 +葚 4471 shen4ren4 +葛 4472 ge2ge3 1693 +葜 4480 jie2qia1 +葝 4412 jing4 +葞 4424 mi3 +葟 4410 huang2 +葠 4424 shen1 +葡 4422 pu2bei4 2630 +葢 4410 gai4ge3he2 +董 4410 dong3zhong3 1426 +葤荮 4494 zhou4 +葥 4422 qian2 +葦苇 4450 wei3 +葧 4442 bo2 +葨 4473 wei1 +葩 4461 pa1 +葪 4422 ji4jie4 +葫 4462 hu2 2997 +葬 4444 zang4 1962 +葭 4424 jia1xia2 +葮 4444 duan4 +葯药 4492 yao4yue4 +葰 4424 jun4sui1 +葱蔥 4433 cong1chuang1 2938 +葲 4490 quan2 +葳 4425 wei1 +葴 4425 zhen1qian2xian2 +葵 4480 kui2 3309 +葶 4420 ting2ding3 +葷荤 4450 hun1xun1 +葸 4433 xi3 +葹 4421 shi1 +葺 4440 qi4 +葻 4421 lan2 +葼 4440 zong1 +葽 4440 yao1 +葾 4433 yuan1 +葿 4426 mei2 +蒀 4410 yun1 +蒁 4430 shu4 +蒂 4422 di4 1723 +蒃 4423 zhuan4 +蒄 4421 guan1 +蒅 4490 ran3 +蒆 4440 xue1 +蒇蕆 4425 chan3 +蒈 4460 kai3 +蒉蕢 4480 kui4kuai4 +蒊 4461 hua1 +蒋蔣 4424 jiang3jiang1 2179 +蒌蔞 4440 lou2 +蒍 4432 wei2wei3 +蒎 4413 pai4 +蒏 4460 yong4 +蒐 4421 sou1 +蒑 4424 yin1 +蒒 4472 shi1 +蒓莼 4491 chun2 +蒔莳 4464 shi2shi4 +蒕 4410 yun1 +蒖 4480 zhen1 +蒗 4413 lang4 +蒘 4450 nu2 +蒙 4423 meng2 1040 +蒚 4422 he2 +蒛 4478 que1 +蒜 4499 suan4 3068 +蒝 4429 yuan2 +蒞莅 4421 li4 +蒟 4412 ju3 +蒠 4433 xi2xi1 +蒡 4422 bang4pang2 +蒢 4429 chu2 +蒣 4429 xu2 +蒤 4419 tu2 +蒥 4460 liu2 +蒦 4440 huo4 +蒧 4425 zhen1dian3 +蒨 4422 qian4 +蒩 4491 zu1 +蒪 4434 po4 +蒫 4451 cuo1 +蒬 4441 yuan1 +蒭 4442 chu2 +蒮 4421 yu4 +蒯 4220 kuai3kuai4 +蒰 4444 pan2 +蒱 4452 pu2 +蒲 4412 pu2bo2 2715 +蒳 4492 na4 +蒴 4442 shuo4 +蒵 4480 xi2xi4 +蒶 4492 fen2 +蒷 4480 yun2 +蒸 4433 zheng1 2516 +蒹 4423 jian1 +蒺 4418 ji2 +蒻 4422 ruo4 +蒼苍 4460 cang1cang3 +蒽 4433 en1 +蒾 4430 mi2 +蒿 4422 hao1gao3 +蓀荪 4449 sun1 +蓁 4490 zhen1qin2 +蓂 4480 ming2 +蓃 4440 huo4 +蓄 4460 xu4 2063 +蓅 4411 liu2 +蓆 4422 xi2 +蓇 4422 gu3gu1 +蓈 4472 lang2 +蓉 4460 rong2 2193 +蓊 4422 weng3weng4 +蓋盖 4410 gai4ge3he2 +蓌 4440 cuo4 +蓍 4460 shi1 +蓎 4426 tang2 +蓏 4421 luo3 +蓐 4424 ru4 +蓑 4473 suo1sai1sui1 +蓒 4454 xian1 +蓓 4426 bei4 3464 +蓔 4430 yao3 +蓕 4491 gui4 +蓖 4471 bi4bi1 +蓗 4428 zong3 +蓘 4473 gun3 +蓙 4421 zuo4 +蓚 4422 xiu1 +蓛 4494 ce4 +蓜 4461 pei4 +蓝藍 4410 lan2 blue 1136 +蓞 4477 dan4 +蓟薊 4412 ji4 3706 +蓠蘺 4422 li2 +蓡 4414 can1shen1 +蓢 4472 lang2 +蓣蕷 4428 yu4 +蓤 4414 ling2 +蓥鎣 4410 ying4ying2 +蓦驀 4412 mo4 2847 +蓧 4429 diao4tiao1tiao2 +蓨 4422 tiao1tiao2 +蓩 4422 mao4 +蓪 4430 tong1 +蓫 4430 zhu2 +蓬 4430 peng2peng4 1956 +蓭 4421 an1 +蓮莲 4430 lian2lian3 +蓯苁 4428 cong1 +蓰 4428 xi3 +蓱 4434 ping2 +蓲 4471 qiu1xu1 +蓳 4410 jin4 +蓴莼 4434 chun2 +蓵 4458 jie2 +蓶 4461 wei3 +蓷 4451 tui1 +蓸 4460 cao2 +蓹 4422 yu3 +蓺 4411 yi4 +蓻 4441 ji2 +蓼 4420 liao3lu4 +蓽荜 4450 bi4 +蓾 4460 lu3 +蓿 4426 su4xu4 +蔀 4462 bu4pou3 +蔁 4450 zhang1 +蔂虆 4490 luo2 +蔃 4423 jiang4 +蔄 4422 man4 +蔅 4422 yan2 +蔆 4414 ling2 +蔇 4471 ji4xi4 +蔈 4490 piao3biao1 +蔉 4473 gun3 +蔊 4494 han3han4 +蔋 4434 di2 +蔌 4498 su4 +蔍 4421 lu4 +蔎 4464 she4 +蔏 4422 shang1 +蔐 4422 di2 +蔑 4425 mie4 3001 +蔒 4433 xun1 +蔓 4440 man4wan4 2803 +蔔卜 4462 bo5bo2 +蔕 4422 di4 +蔖 4421 cuo2 +蔗 4423 zhe4 3700 +蔘 4420 sen1san1shen1 +蔙 4428 xuan4 +蔚 4424 wei4yu4 2836 +蔛 4424 hu2 +蔜 4424 ao2 +蔝 4469 mi3 +蔞蒌 4440 lou2 +蔟 4428 cu4 +蔠 4493 zhong1 +蔡 4490 cai4 2051 +蔢 4440 po2 +蔣蒋 4424 jiang3jiang1 +蔤 4477 mi4 +蔥葱 4433 cong1 +蔦茑 4432 niao3 +蔧 4417 hui4sui4 +蔨 4460 jun4 +蔩 4480 yin2 +蔪 4452 jian4 +蔫 4432 nian1 +蔬 4411 shu1 2712 +蔭荫 4423 yin4yin1 +蔮 4460 kui4 +蔯 4429 chen2 +蔰 4421 hu4 +蔱 4494 sha1 +蔲 4421 kou4 +蔳 4412 qian4 +蔴 4424 ma2 +蔵 4425 zang1cang2 +蔶 4480 ze2 +蔷薔 4460 qiang2 3185 +蔸 4421 dou1 +蔹蘞 4414 lian4lian2 +蔺藺 4422 lin4 +蔻 4421 kou4 +蔼藹 4472 ai3 3343 +蔽 4424 bi4fu4 2158 +蔾 4490 li2 +蔿 4422 wei2 +蕀 4499 ji2 +蕁荨 4434 xun2qian2tan2 +蕂 4422 sheng4 +蕃 4460 fan2 3501 +蕄 4422 meng2 +蕅 5532 ou3 +蕆蒇 4425 chan3 +蕇 4440 dian3 +蕈 4440 xun4 +蕉 4433 jiao1 3287 +蕊 4433 rui3 3092 +蕋 4411 rui3 +蕌 4466 lei3 +蕍 4412 yu2 +蕎荞 4422 qiao2 +蕏 4426 zhu1 +蕐 4450 hua2 +蕑 4422 jian1 +蕒荬 4480 mai3 +蕓芸 4413 yun2 +蕔 4444 bao1 +蕕莸 4426 you2 +蕖 4490 qu2 +蕗 4416 lu4 +蕘荛 4421 rao2 +蕙 4433 hui4 3479 +蕚 4420 e4 +蕛 4492 ti2 +蕜 4433 fei3 +蕝 4491 jue2zui4 +蕞 4414 zui4 +蕟 4424 fa4fei4 +蕠 4490 ru2 +蕡 4480 fen2 +蕢蒉 4480 kui4kuai4 +蕣 4425 shun4 +蕤 4423 rui2 +蕥 4421 ya3 +蕦 4428 xu1 +蕧 4424 fu4 +蕨 4428 jue2 +蕩荡 4412 dang4 +蕪芜 4433 wu2wu3 +蕫 5510 tong2dong3 +蕬 4499 si1 +蕭萧 4422 xiao1 +蕮 4432 xi4 +蕯 4421 long2 +蕰薀 4411 yun4 +蕱 2992 shao1 +蕲蘄 4452 qi2 +蕳 4422 jian1 +蕴藴 4411 yun4 2359 +蕵 4423 sun1 +蕶 4430 ling2 +蕷蓣 4428 yu4 +蕸 4430 xia2 +蕹 4421 weng4 +蕺 4415 ji2qie4 +蕻 4478 hong4hong2 +蕼 4475 si4 +蕽 4423 nong2 +蕾 4460 lei3 2567 +蕿 4484 xuan1 +薀蕰 4411 yun4 +薁 4480 yu4 +薂 4424 xi2 +薃 4412 hao4hao3 +薄 4414 bao2bo2bo4 thin 1247 +薅 4444 hao1 +薆 4424 ai4 +薇 4424 wei2wei1 2507 +薈荟 4460 hui4 +薉 4425 wei4hui4 +薊蓟 4432 ji4 +薋 4480 ci1ci2 +薌芗 4422 xiang1xiang3 +薍 4421 wan4luan4 +薎 4425 mie4 +薏 4433 yi4 +薐 4494 leng2 +薑 4410 jiang1 +薒 4490 can4 +薓 4414 shen1 +薔蔷 4460 qiang2 +薕 4423 lian2 +薖 4430 ke1 +薗 4460 yuan2 +薘荙 4430 da2 +薙 4481 ti4 +薚 4422 tang2 +薛 4474 xue1 1988 +薜 4464 bi4 +薝 4426 zhan2 +薞 4423 sun1 +薟莶 4488 xian1lian2 +薠 4488 fan2 +薡 4422 ding3 +薢 4425 jie1xie4 +薣 4414 gu3 +薤 4421 xie4 +薥 4412 shu3 +薦荐 4422 jian4 +薧 4421 kao3hao1 +薨 4421 hong1 +薩萨 4421 sa4 +薪 4492 xin1 2440 +薫 4433 xun1 +薬 4490 yao4 +薭 4494 bai4 +薮藪 4444 sou3 +薯 4460 shu3 yam potato 3572 +薰 4433 xun1 3520 +薱 4414 dui4 +薲 4480 pin2 +薳䓕 4430 wei3 +薴苧 4420 neng2ning4 +薵 4464 chou2zhou4 +薶 4421 mai2wo1 +薷 4422 ru2 +薸 4419 piao1 +薹 4410 tai2 +薺荠 4422 ji4qi2 +薻 4419 zao3 +薼 4421 chen2 +薽 4411 zhen1 +薾 4422 er3 +薿 4488 ni3 +藀 4480 ying2 +藁 4490 gao3 +藂 4423 cong2 +藃 4428 xiao1hao4 +藄 4490 qi2 +藅 4462 fa2 +藆 4450 jian3 +藇 4480 xu4yu4 +藈 4468 kui1 +藉 4496 jie4ji2 2707 +藊 4492 bian3 +藋 4421 diao4 +藌 4410 mi4 +藍蓝 4410 lan2 +藎荩 4410 jin4 +藏 4425 cang2zang4 750 +藐 4421 miao3 +藑 4440 qiong2 +藒 4492 qie4 +藓蘚 4415 xian3 +藔 4490 liao2 +藕 4492 ou3 3580 +藖 4480 xian2 +藗 4430 su4 +藘 4423 lv2 +藙 4424 yi4 +藚 4480 xu4 +藛 4432 xie3 +藜 4490 li2 3994 +藝艺 4473 yi4 +藞 4466 la3 +藟 4466 lei3 +藠 4466 xiao4jiao4 +藡 4430 di2 +藢 4424 zhi3 +藣 4421 bei1 +藤 4429 teng2 2291 +藥药 4490 yao4yue4shuo4lue4 +藦 4425 mo4mo2 +藧 4494 huan4 +藨 4423 biao1pao1piao3 +藩 4416 fan2fan1 2983 +藪薮 4444 sou3 +藫 4414 tan2 +藬 4428 tui1 +藭 4442 qiong2 +藮 4493 qiao2 +藯 4433 wei4 +藰 4412 liu2 +藱 4411 hui4hui2 +藲 4491 ou1 +藳 4490 gao3 +藴蕴 4410 yun4 +藵 4473 bao3 +藶苈 4421 li4 +藷薯 4466 shu3 +藸 4426 chu2 +藹蔼 4462 ai3 +藺蔺 4422 lin4 +藻 4419 zao3 3218 +藼 4433 xuan1 +藽 4491 chen4 +藾 4498 lai4 +藿 4421 huo4he2 +蘀 4454 tuo4 +蘁 4410 wu4e4 +蘂 4490 rui3 +蘃 4490 rui3 +蘄蕲 4452 qi2ji1qin2 +蘅 4422 heng2 +蘆芦 4421 lu2 +蘇苏 4439 su1su4 +蘈 4428 tui2 +蘉 4424 mang2 +蘊蕴 4491 yun4wen1 +蘋苹 4428 ping2peng1 +蘌 4490 yu3 +蘍 4432 xun1 +蘎 4421 ji4 +蘏 4498 jiong1jiong3 +蘐 4464 xian1xuan1 +蘑 4426 mo2 3849 +蘒 4491 qiu1 +蘓 4493 su1 +蘔 4498 jiong1jiong3 +蘕 4493 peng2 +蘖櫱 4490 nie4bi4bo4 +蘗 4490 bo4 +蘘 4473 rang2 +蘙 4412 yi4 +蘚藓 4435 xian3 +蘛 4472 yu2 +蘜 4452 ju2 +蘝 4488 lian4lian3lian2 +蘞蔹 4484 lian4lian3lian2xian1 +蘟 4423 yin3 +蘠 4426 qiang2 +蘡 4440 ying1 +蘢茏 4421 long2long3long4 +蘣 4481 tong4 +蘤 4462 wei3hua1 +蘥 4422 yue4 +蘦 4466 ling2 +蘧 4430 qu2qu4 +蘨 4479 yao2 +蘩 4490 fan2 +蘪 4490 mi2 +蘫 4411 lan2 +蘬 4412 kui1 +蘭兰 4422 lan2 +蘮 4422 ji4 +蘯 4410 dang4 +蘰 4494 man4 +蘱 4488 lei4 +蘲 4410 lei2 +蘳 4481 hua3 +蘴 4410 feng1 +蘵 4415 zhi2 +蘶 4441 wei4 +蘷 4440 kui2 +蘸 4463 zhan4 3969 +蘹 4493 huai4huai2 +蘺蓠 4441 li2 +蘻 4490 ji4 +蘼 4421 mi2 +蘽 4490 lei3 +蘾 4413 huai4 +蘿萝 4491 luo2 +虀 4410 ji1 +虁 4440 kui2 +虂 4416 lu4 +虃 4415 jian1 +虄 4411 sal +虅 4422 teng2 +虆蔂 4490 lei2 +虇 4421 quan3 +虈 4466 xiao1 +虉 4422 yi4 +虊 4490 luan2 +虋 4422 men2 +虌 4471 bie1 +虍 2121 hu1 u +虎 2121 hu3hu4 1090 +虏虜 2122 lu3 3113 +虐 2121 nue4 2791 +虑慮 2123 lv4 964 +虒 7221 si1zhai4yi2 +虓 4101 xiao1 +虔 2124 qian2 3021 +處处 2124 chu4chu3 +虖 2124 hu1hu4hu2 +虗 2121 xu1 +虘 2121 cuo2 +虙 2123 fu2 +虚虛 2121 xu1qu1 868 +虛虚 2121 xu1 +虜虏 2122 lu3 +虝 2721 hu3 +虞 2128 yu2 2530 +號号 6121 hao4hao2 +虠 0141 jiao3 +虡 2128 ju4 +虢 2131 guo2 +虣 1111 bao4 +虤 2121 yan2 +虥 2325 zhan4 +虦 5151 zhan4 +虧亏 2122 kui1 +虨 2222 ban1 +虩 9291 xi4 +虪 2723 shu2shu1 +虫蟲 5013 chong2 u insect bug 1590 +虬虯 5211 qiu2 +虭 5712 diao1 +虮蟣 5711 ji1ji3qi2 +虯虬 5210 qiu2 +虰 5112 cheng2 +虱 1711 shi1 louse 3980 +虲 5310 u1 +虳 5712 di4 +虴 5211 zhe2zha4 +虵 5411 she2 +虶 5114 yu1 +虷 5114 gan1han2 +虸 5714 zi3 +虹 5111 hong2 rainbow 1927 +虺 1521 hui3hui1 +虻 5011 meng2 +虼 5811 ge4 +虽雖 6013 sui1 414 +虾蝦 5113 xia1 shrimp 3016 +虿蠆 1013 chai4 +蚀蝕 2573 shi2 eclipse 2503 +蚁蟻 5410 yi3 ant 2739 +蚂螞 5712 ma3ma1ma4 dragonfly 3029 +蚃 2013 xiang3 +蚄 5012 fang1 +蚅 5111 e4 +蚆 5711 pa1 +蚇 5718 chi3 +蚈 5114 qian1 +蚉 0013 wen2 +蚊 5014 wen2 mosquito 2911 +蚋 5412 rui4 +蚌 5510 bang4beng4 3818 +蚍 5111 bi3pi2 +蚎 5610 yue4 +蚏 5712 yue4 +蚐 5712 jun1 +蚑 5414 qi2 +蚒 5714 tong2ran2 +蚓 5210 yin3 +蚔 5214 qi2 +蚕蠶 2013 can2tian3 2930 +蚖 5111 yuan2 +蚗 5518 jue2 +蚘 5311 hui2 +蚙 5812 qin2 +蚚 5212 qi2 +蚛 5510 zhong4 +蚜 5114 ya2 +蚝 5211 ci4hao2 +蚞 5419 mu4 +蚟 5111 wang2 +蚠 8013 fen2 +蚡 5812 fen2 +蚢 5011 hang2 +蚣 5813 gong1zhong1 +蚤 7713 zao3 +蚥 5814 fu3 +蚦 5715 ran2 +蚧 5812 jie4 +蚨 5518 fu2 +蚩 2213 chi1 +蚪 5410 dou3 +蚫 5711 piao2 +蚬蜆 5711 xian4xian3 +蚭 5711 ni2 +蚮 5314 te4 +蚯 5211 qiu1 +蚰 5516 you2 +蚱 5811 zha4 +蚲 5114 ping2 +蚳 5214 chi2 +蚴 5412 you4 +蚵 5112 he2ke4 +蚶 5417 han1 +蚷 5711 ju4qu2 +蚸 5214 li4 +蚹 5410 fu4 +蚺 5514 ran2 +蚻 4213 zha2 +蚼 5712 gou3 +蚽 5111 pi2 +蚾 5414 bo3 +蚿 5013 xian2 +蛀 5011 zhu4 3986 +蛁 5716 diao1 +蛂 5314 bie2 +蛃 5112 bing3 +蛄 5416 gu1 +蛅 5116 zhan1 +蛆 5711 qu1ju1 +蛇 5311 she2yi2 snake 1793 +蛈 5518 tie4 +蛉 5813 ling2 +蛊蠱 5010 gu3 3720 +蛋 1713 dan4 egg 1473 +蛌 5213 gu3 +蛍 9013 ying2 +蛎蠣 5112 li4 +蛏蟶 5711 cheng1 +蛐 5516 qu1 +蛑 5315 mou2 +蛒 5716 ge2 +蛓 4315 ci4 +蛔 5610 hui2 +蛕 5412 hui2 +蛖 5311 mang2 +蛗 2713 fu4 +蛘 5815 yang2 +蛙 5411 wa1 frog 3024 +蛚 5210 lie4 +蛛 5519 zhu1 3022 +蛜 5710 yi1 +蛝 5713 xian2 +蛞 5216 kuo4 +蛟 5014 jiao1 3671 +蛠 5412 li4 +蛡 5712 yi4 +蛢 5814 ping2 +蛣 5416 jie2 +蛤 5816 ha2ge2 3743 +蛥 5712 she2 +蛦 5518 yi2 +蛧 5712 wang3 +蛨 5116 mo4 +蛩 1713 qiong2 +蛪 5713 qie4 +蛫 5711 gui3 +蛬 4413 qiong2 +蛭 5111 zhi4 +蛮蠻 0013 man2 2194 +蛯 5411 lao3 +蛰蟄 5513 zhe2 +蛱蛺 5518 jia2 +蛲蟯 5511 rao2 +蛳螄 5112 si1 snail +蛴蠐 5012 qi2 +蛵 5111 xing1 +蛶 5214 lie4 +蛷 5319 qiu2 +蛸 5912 shao1xiao1 +蛹 5712 yong3 +蛺蛱 5418 jia2 +蛻蜕 5811 tui4yue4shui4 +蛼 5510 che1 +蛽 5718 bai4 +蛾 5315 e2yi3 3613 +蛿 5816 han4 +蜀 6012 shu3 2790 +蜁 5818 xuan2 +蜂 5715 feng1 2187 +蜃 7113 shen4 +蜄 5113 zhen4 +蜅 5312 fu3 +蜆蚬 5611 xian4xian3 +蜇 5213 zhe2zhe1 +蜈 5618 wu2 +蜉 5214 fu2 +蜊 5210 li2 +蜋 5313 lang2 +蜌 5211 bi4 +蜍 5819 chu2shu2yu2 +蜎 5612 yuan1xuan1 +蜏 5212 you3 +蜐 5412 jie2 +蜑 1113 dan4 +蜒 5214 yan2 3696 +蜓 5214 ting2 +蜔 5712 dian4 +蜕蛻 5811 shui4 3782 +蜖 5610 hui2 +蜗蝸 5612 wo1 snail 3990 +蜘 5610 zhi1 3437 +蜙 5813 song1 +蜚 1113 fei1 +蜛 5716 ju1 +蜜 3013 mi4 2167 +蜝 4413 qi2 +蜞 5418 qi2 +蜟 5012 yu4 +蜠 5610 jun3 +蜡蜡 5416 la4 candle wax 2658 +蜢 5711 meng3meng4 +蜣 5811 qiang1 +蜤 4213 si1 +蜥 5212 xi1 +蜦 5812 lun2 +蜧 5314 li4 +蜨 5518 die2 +蜩 5712 tiao2diao4 +蜪 5712 tao1 +蜫 5611 kun1 +蜬 5717 gan1 +蜭 5717 han4 +蜮 5315 yu4guo1 +蜯 5515 bang4 +蜰 7713 fei2 +蜱 5614 pi2miao2 +蜲 5214 wei3 +蜳 5014 dun1 +蜴 5612 yi4xi2 +蜵 5210 yuan1 +蜶 5014 su4 +蜷 5911 quan2juan3 3905 +蜸 7713 qian3 +蜹 5412 rui4 +蜺 5711 ni2 +蜻 5512 qing1jing1 +蜼 5011 wei4wei3 +蜽 5112 liang3 +蜾 5619 guo3luo3 +蜿 5311 wan1wan3 3852 +蝀 5519 dong1dong4 +蝁 1013 e4 +蝂 5214 ban3 +蝃 5714 di4 +蝄 5712 wang3 +蝅 1113 can2 +蝆 5115 yang3yang2 +蝇蠅 5611 ying2 3017 +蝈蟈 5610 guo1 +蝉蟬 5615 chan2 2864 +蝊 5318 u1 +蝋 5211 la4 +蝌 5410 ke1 +蝍 5712 ji2 +蝎 5612 he2xie1 3396 +蝏 5012 ting2 +蝐 5616 mai4mei4 +蝑 5712 xu1 +蝒 5116 mian2 +蝓 5812 yu2 +蝔 5216 jie1 +蝕蚀 8573 shi2li4long2 +蝖 5311 xuan1 +蝗 5611 huang2 3951 +蝘 5111 yan3yan4 +蝙 5312 bian1pian2 +蝚 5719 rou2 +蝛 5315 wei1 +蝜 5718 fu4 +蝝 5713 yuan2 +蝞 5716 mei4 +蝟猬 5612 wei4 +蝠 5116 fu2 3880 +蝡 5118 ru2 +蝢 5118 xie2 +蝣 5814 you2 +蝤 5816 qiu2 +蝥 1813 mao2 +蝦虾 5714 xia1 +蝧 5418 ying1 +蝨 1713 shi1 +蝩 5211 chong2 +蝪 5612 tang1 +蝫 5416 zhu1 +蝬 5214 zong1 +蝭 5618 ti2 +蝮 5814 fu4 +蝯 5214 yuan2 +蝰 5411 kui2 +蝱 0013 meng2 +蝲 5210 la4 +蝳 5515 dai4 +蝴 5712 hu2 2999 +蝵 2913 qiu1 +蝶 5419 die2 butterfly 1955 +蝷 5014 li4 +蝸蜗 5712 wo1 +蝹 5611 yun1 +蝺 5212 ju3 +蝻 5412 nan3 +蝼螻 5914 lou2 +蝽 5516 qun3 +蝾蠑 5419 rong2 +蝿 5711 ying2 +螀螿 3713 jiang1 +螁 5713 ban1 +螂 5712 lang2 +螃 5012 pang2 3936 +螄蛳 5112 si1 +螅 5613 xi1ci4 +螆 5813 ci4 +螇 5218 xi1 +螈 5119 yuan2 +螉 5812 weng1 +螊 5813 lian2xian2 +螋 5714 sou1 +螌 2713 ban1pan2 +融 1523 rong2 1315 +螎 5112 rong2 +螏 5018 ji2 +螐 5712 wu1 +螑 5618 qiu4 +螒 4843 han4 +螓 5519 qin2 +螔 5211 yi2 +螕 5711 bi1 +螖 5712 hua2 +螗 5016 tang2 +螘 5211 yi3 +螙 4013 du4 +螚 2213 nai4 +螛 5316 he2 +螜 4713 hu2 +螝 5611 hui4 +螞蚂 5112 ma3ma4ma1 +螟 5718 ming2 +螠 5811 yi4 +螡 0013 wen2 +螢萤 9913 ying2 +螣 7923 teng2te4 +螤 0718 yu3 +螥 5816 cang1 +螦 5519 sao1 +螧 5416 qi2 +螨蟎 5412 man3 +螩 5719 dao1 +螪 5012 shang1 +螫 4813 shi4zhe1 +螬 5426 cao2 +螭 5012 chi1 +螮䗖 5412 di4 +螯 4813 ao2 +螰 5011 lu4 +螱 7413 wei4 +螲 5311 zhi4die2 +螳 5911 tang2 +螴 7529 chen2 +螵 5119 piao1pi2 +螶 7113 qu2 +螷 0023 pi2beng4bi4 +螸 8713 yu2 +螹 5212 jian4chan2 +螺 5619 luo2 2765 +螻蝼 5514 lou2 +螼 5411 qin3 +螽 2713 zhong1 +螾 5318 yin3 +螿螀 2713 jiang1 +蟀 5014 shuai4 +蟁 7713 wen2 +蟂 5712 jiao1 +蟃 5714 wan4 +蟄蛰 4513 zhe2zhi2 +蟅 5013 zhe4 +蟆 5418 ma2mo4 +蟇 4413 ma2 +蟈蝈 5610 guo1yu4 +蟉 5712 liu2liao4 +蟊 1713 mao2meng2 +蟋 5213 xi1 +蟌 5613 cong1 +蟍 5219 li2 +蟎螨 5412 man3 +蟏蠨 5412 xiao1 +蟐 5912 chan2 +蟑 5014 zhang1 +蟒 5414 mang3meng3 +蟓 5713 xiang4 +蟔 5613 mo4 +蟕 5212 zui1 +蟖 5212 si1 +蟗 4013 qiu1 +蟘 5318 te4 +蟙 5315 zhi2 +蟚 4213 peng2 +蟛 5212 peng2 +蟜 5212 jiao3 +蟝 5119 qu2 +蟞 9713 bie2 +蟟 5419 liao2 +蟠 5216 pan2fan2 3960 +蟡 5212 gui3 +蟢 5416 xi3 +蟣虮 5215 ji3qi2 +蟤 5718 zhuan1 +蟥 5418 huang2 +蟦 5418 fei4ben1 +蟧 5912 lao2 +蟨 7113 jue2 +蟩 5118 jue2 +蟪 5513 hui4 +蟫 5114 yin2tan2xun2 +蟬蝉 5615 chan2shan4 +蟭 5013 jiao1 +蟮 5816 shan4 +蟯蛲 5411 rao2nao2rao4 +蟰 5512 xiao1 +蟱 5813 mou2 +蟲虫 5013 chong2 +蟳 5714 xun2 +蟴 4213 si1 +蟵 5114 chu2 +蟶蛏 5611 cheng1 +蟷 5916 dang1 +蟸 1013 li2 +蟹 2713 xie4 3058 +蟺 5011 shan4 +蟻蚁 5815 yi3ji3 +蟼 4813 jing3 +蟽 5413 da2 +蟾 5716 chan2 +蟿 4713 qi4ji4 +蠀 5718 ci1 +蠁蚃 2713 xiang4xiang3 +蠂 5419 she4 +蠃 0021 luo3luo2guo3 +蠄 5812 qin2 +蠅蝇 5711 ying2 +蠆虿 4413 chai4 +蠇 5412 li4 +蠈 6313 ze2 +蠉 5613 xuan1 +蠊 5013 lian2 +蠋 5612 zhu2 +蠌 5614 ze2 +蠍 5718 xie1 +蠎 5414 mang3meng3 +蠏 5715 xie4 +蠐蛴 5012 qi2 +蠑蝾 5919 rong2 +蠒 1013 jian3 +蠓 5413 meng3 +蠔 5013 hao2 +蠕 5112 ru2ruan3 3707 +蠖 5414 huo4yue4 +蠗 5711 zhuo2 +蠘 5315 jie2 +蠙 5318 bin1pin2 +蠚 4413 he4he1ruo4 +蠛 5415 mie4 +蠜 2213 fan2 +蠝 5616 lei2lei3 +蠞 8813 jie2 +蠟蜡 5211 la4 +蠠 1013 mi4 +蠡 2713 li3 +蠢 5013 chun3 2615 +蠣蛎 5112 li4 +蠤 8013 qiu1 +蠥 2013 nie4 +蠦 5111 lu2 +蠧 4013 du4 +蠨蟏 5412 xiao1 +蠩 5416 zhu1 +蠪 0113 long2 +蠫 2213 li4li2 +蠬 5111 long2 +蠭 3713 feng1 +蠮 5712 ye1 +蠯 0023 beng4 +蠰 5013 nang2 +蠱蛊 5010 gu3 +蠲 8612 juan1 +蠳 5614 ying1 +蠴 5416 shu3 +蠵 5212 xi1xi2 +蠶蚕 1113 can2 +蠷 5611 qu2 +蠸 5411 quan2 +蠹 4013 du4 +蠺 1113 can2 +蠻蛮 2213 man2 +蠼 5614 jue2qu2 +蠽 9313 jie2 +蠾 5712 zhu2 +蠿 2213 zha2 +血 2710 xie3xue4 u blood 680 +衁 0010 huang1 +衂 2712 niu4nv4 +衃 2119 pei1 +衄 2711 nv4 +衅釁 2915 xin4 3424 +衆众 2723 zhong4 +衇 2213 mo4mai4 +衈 2114 er4er3 +衉 2716 ke4 +衊 2415 mie4 +衋 5010 xi4 +行 2122 xing2hang2 u row 46 +衍 2122 yan3yan2 2190 +衎 2122 kan4 +衏 2122 yuan4 +衐 2122 qu2 +衑 2122 ling2 +衒 2122 xuan4 +術术 2122 shu4 +衔銜 2122 xian2 2301 +衕 2122 tong4dong4 +衖 2122 long4 +街 2122 jie1 street 924 +衘 2122 xian2yu4 +衙 2122 ya2yu2yu3yu4 2882 +衚胡 2122 hu2 +衛卫 2122 wei4 +衜 2122 dao4 +衝冲 2122 chong1chong4 +衞 2122 wei4 +衟 2122 dao4 +衠 2122 zhun1 +衡 2122 heng2 1513 +衢 2122 qu2 3912 +衣 0073 yi1yi4 u 582 +衤 3020 yi1 +补補 3320 bu3 1015 +衦 3124 gan3 +衧 3124 yu2 +表 5073 biao3 184 +衩 3724 cha4cha3 +衪 3421 yi3yi4 +衫 3222 shan1 1897 +衬襯 3420 chen4 2207 +衭 3528 fu1 +衮袞 0073 gun3 +衯 3822 fen1 +衰 0073 shuai1 1907 +衱 3724 jie2 +衲 3422 na4 +衳 3823 zhong1 +衴 3421 dan3 +衵 3620 ri4ni4 +衶 3520 zhong4zhong3chong1 +衷 5073 zhong1zhong4 1959 +衸 3822 xie4 +衹只 3224 qi2zhi3 +衺 0073 xie2 +衻 3725 ran2 +衼 3424 zhi1 +衽 3221 ren4 +衾 8073 qin1 +衿 3822 jin1qin4 +袀 3722 jun1 +袁 4073 yuan2 1974 +袂 3528 mei4yi4 3746 +袃 4773 chai4 +袄襖 3228 ao3 3346 +袅裊 2773 niao3 3359 +袆褘 3522 hui1 +袇 5724 ran2 +袈 4673 jia1 +袉 3321 tuo2 +袊 3823 ling3 3839 +袋 2373 dai4 bag 1265 +袌 0073 bao4 +袍 3721 pao2bao4 2129 +袎 3422 yao4 +袏 3421 zuo4 +袐 3320 bi4 +袑 3726 shao4 +袒 3621 tan3zhan4 3507 +袓 3721 ju3 +袔 3122 he4 +袕 3328 shu4 +袖 3526 xiu4 1664 +袗 3822 zhen3zhen1 +袘 3821 yi2yi4 +袙 3620 pa4 +袚 3324 bo1fu2 +袛 3224 di1 +袜襪 3529 wa4mo4 socks 2951 +袝 3420 fu4 +袞衮 0073 gun3 +袟 3528 zhi4 +袠 0073 zhi4 +袡 3525 ran2 +袢 3925 pan4fan2 +袣 3421 yi4 +袤 0073 mao4mou2 +袥 3126 tuo1 +袦 3227 na4 +袧 3722 kou1 +袨 3023 xian4xuan4 +袩 3126 chan1 +袪 3423 qu1 +被 3424 bei4 154 +袬 0073 gun3 +袭襲 4373 xi2 1555 +袮 3829 mi2 +袯襏 3324 bo2 +袰 7773 bo1 +袱 3328 fu2 2654 +袲 0073 yi2 +袳 3722 chi3qi3duo3nuo3 +袴 3422 ku4 +袵 3221 ren4 +袶 3725 jiang4 +袷 3826 jia2jie2 +袸 3424 cun2 +袹 3126 mo4 +袺 3426 jie2 +袻 3122 er2 +袼 3726 luo4ge1 +袽 3620 ru2 +袾 3529 zhu1 +袿 3421 gui1 +裀 3620 yin1 +裁 4375 cai2 1456 +裂 1273 lie4lie3 1538 +裃 3123 ka3 +裄 3122 hang2 +装裝 3473 zhuang1 465 +裆襠 3927 dang1 +裇 3721 xu1 +裈褌 3725 kun1 +裉 3723 ken4 +裊袅 2773 niao3 +裋 3121 shu4 +裌 3428 jia2 +裍 3620 kun3 +裎 3621 cheng2cheng3 +裏里 0073 li3 u +裐 3622 juan1 +裑 3724 shen1 +裒 0073 pou2bao1 +裓 3325 ge2jie1 +裔 0022 yi4 2888 +裕 3826 yu4 1999 +裖 3123 zhen3zhen4 +裗 3021 liu2 +裘 4373 qiu2 2936 +裙 3726 qun2 skirt 2118 +裚 5273 ji4 +裛 0073 yi4 +補补 3322 bu3 +裝装 2473 zhuang1 +裞 3821 shui4 +裟 3973 sha1 +裠 1773 qun2 +裡里 3621 li3 +裢褳 3423 lian2 +裣襝 3821 lian4lian3 +裤褲 3025 ku4 2060 +裥襇 3722 jian3 +裦 0073 fou2 +裧 3928 chan1 +裨 3624 bi4pi2 +裩 3621 gun1 +裪 3722 tao2 +裫 3220 yuan4 +裬 3424 ling2 +裭 3121 chi3 +裮 3626 chang1 +裯 3722 chou2dao1 +裰 3829 duo2duo1 +裱 3523 biao3 +裲 3122 liang3 +裳 9073 chang2shang2 2640 +裴 1173 pei2 2428 +裵 0073 pei2 +裶 3121 fei1 +裷 3921 yuan1gun3 +裸 3629 luo3 nude naked 2417 +裹 0073 guo3 wrap 2037 +裺 3421 yan3 +裻 2773 du3du1 +裼 3622 xi2ti4xi1 +製制 2273 zhi4 +裾 3726 ju1ju4 +裿 3422 qi3 +褀 3428 ji4 +褁 6073 zhi2 +褂 3320 gua4 3429 +褃 3122 ken4 +褄 3524 qi1 +褅 3011 ti4 +褆 3628 ti2 +複复 3824 fu4 +褈 3221 chong2 +褉 3728 xie1 +褊 3222 bian3pian1 +褋 3429 die2 +褌裈 3725 kun1 +褍 3222 duan1 +褎 0073 xiu4you4 +褏 0073 xiu4you4 +褐 3622 he2he4 3129 +褑 3224 yuan4 +褒 0073 bao1 3543 +褓 3629 bao3 +褔 3126 fu4 +褕 3822 yu2 +褖 3723 tuan4 +褗 3121 yan3 +褘袆 3525 hui1 +褙 3122 bei4 +褚 3426 zhu3 3432 +褛褸 3924 lv3 +褜 7773 pao2 +褝 3925 dan1 +褞 3621 yun3 +褟 3622 da2 +褠 3524 gou1 +褡 3426 da1 +褢 0073 huai2 +褣 3326 rong2 +褤 3423 yuan4 +褥 3124 ru4nu4 3151 +褦 3221 nai4 +褧 1973 jiong3 +褨 3821 suo3 +褩 2773 ban1 +褪 3723 tun4tui4 3253 +褫 3221 chi3 +褬 3729 sang3 +褭 0073 niao3 +褮 9973 ying1 +褯 3022 jie4 +褰 3073 qian1 +褱 0073 huai2 +褲裤 3422 ku4 +褳裢 3523 lian2 +褴襤 3821 lan2 +褵 3022 li2 +褶 3726 zhe3 +褷 3128 shi1 +褸褛 3524 lv3 +褹 3521 yi4 +褺 4573 die2 +褻亵 0073 xie4die2 +褼 3121 xian1 +褽 7473 wei4 +褾 3139 biao3 +褿 3526 cao2 +襀 3528 ji1 +襁 3623 jiang3qiang3 +襂 3322 sen1shan1shen1 +襃 0073 bao1 +襄 0073 xiang1 2718 +襅 3625 bi4 +襆 3228 pu2fu2 +襇裥 3722 jian3 +襈 3728 zhuan4 +襉 3722 jian4 +襊 3624 zui4 +襋 3529 ji2 +襌 3625 dan1 +襍 3029 za2 +襎 3226 fan2 +襏袯 3224 bo2 +襐 3723 xiang4 +襑 3724 xin2 +襒 3834 bie2 +襓 3421 rao2 +襔 3422 man3 +襕 3722 lan2 +襖袄 3728 ao3 +襗 3624 duo2ze4 +襘 3826 gui4 +襙 3629 cao4 +襚 3813 sui4 +襛 3523 nong2 +襜 3726 chan1 +襝裣 3828 lian4lian3chan1 +襞 7073 bi4 +襟 3429 jin1 2494 +襠裆 3926 dang1 +襡 3622 shu2shu3du2 +襢 3021 tan3zhan4 +襣 3624 bi4bi2 +襤褴 3821 lan2 +襥 3228 pu2 +襦 3122 ru2 +襧 3122 zhi3 +襨 3420 tae +襩 3428 shu3 +襪袜 3425 wa4 +襫 3428 shi4 +襬䙓 3621 bai3 +襭 3128 xie2 +襮 3629 bo2 +襯衬 3621 chen4 +襰 3728 lai4 +襱 3121 long2long3 +襲袭 0173 xi2 +襳 3325 xian1shen1 +襴襕 3722 lan2 +襵 3124 zhe2zhe3 +襶 3325 dai4 +襷 3725 ju4 +襸 3428 zan4 +襹 3121 shi1 +襺 3422 jian3 +襻 3425 pan4 +襼 3423 yi4 +襽 3422 lan2 +襾 1022 ya4xi1 u +西 1060 xi1 west 181 +覀 1060 xi1 +要 1040 yao4yao1 19 +覂 1030 feng3 +覃 1040 tan2qin2yan3 3822 +覄 1028 fu4 +覅 1742 biao4 +覆复 1024 fu4 1496 +覇 1052 ba4po4 +覈 1024 he2 +覉 1052 ji1 +覊 1052 ji1 +見见 6021 jian4xian4 u +覌 7641 guan1guan4 +覍 9021 bian4pan2 +覎觃 7721 yan4 +規规 5681 gui1 +覐 7421 jue2jiao4 +覑 2601 pian3 +覒 2671 mao2 +覓觅 2021 mi4 +覔 1021 mi4 +覕 3601 mie4pie1 +視视 3621 shi4 +覗 1661 si1si4 +覘觇 2661 chan1 +覙 2691 luo2 +覚 9021 jue2 +覛 7621 mi4mo4 +覜 3611 tiao4 +覝 1681 lian2 +覞 6621 yao4 +覟 4631 zhi4 +覠 1661 jun1 +覡觋 1611 xi2 +覢 9681 shan3 +覣 2641 wei1 +覤 2621 xi4 +覥觍 5681 tian3 +覦觎 8621 yu2 +覧 7821 lan3 +覨 6621 e4 +覩 4661 du3 +親亲 0691 qin1qing4 +覫 0621 pang3 +覬觊 2611 ji4 +覭 7681 ming2 +覮 9921 ying2 +覯觏 5651 gou4 +覰 2621 qu4 +覱 5221 zhan4 +覲觐 4611 jin3jin4 +観 8621 guan1 +覴 1611 deng1 +覵 7621 jian4 +覶 2621 luo2 +覷觑 2621 qu4 +覸 7621 jian4xian2 +覹 7821 wei2 +覺觉 7721 jue2jiao4 +覻 2621 qu4 +覼 1621 luo2 +覽览 7821 lan3lan4 +覾 0661 shen3 +覿觌 4681 di2ji2 +觀观 4621 guan1guan4 +见見 7721 jian4xian4 look see 132 +观觀 7741 guan1guan4 364 +觃覎 7721 yan4 +规規 5781 gui1 589 +觅覓 2021 mi4 seek 2789 +视視 3721 shi4 343 +觇覘 2761 chan1 +览覽 2821 lan3 1639 +觉覺 9021 jue2jiao4 312 +觊覬 2771 ji4 +觋覡 1711 xi2 +觌覿 4781 di2 +觍覥 5781 tian3 +觎覦 8721 yu2 +觏覯 5741 gou4 +觐覲 4711 jin3 +觑覷 2721 qu4 3351 +角 2722 jiao3jue2 u angel 625 +觓 2220 jiu1qiu2 +觔 2422 jin1 +觕 2752 cu1 +觖 2528 jue2 +觗 2224 zhi4 +觘 2922 chao4 +觙 2724 ji2fan2 +觚 2223 gu1 +觛 2621 dan4 +觜 2222 zi1zui3 +觝 2224 di3 +觞觴 2822 shang1 +觟 2421 hua4xie4 +觠 9022 quan2 +觡 2726 ge2 +觢 5722 chi4 +解 2725 jie3jie4xie4 193 +觤 2721 gui3 +觥 2921 gong1 +触觸 2523 chu4 1184 +觧 2825 jie3 +觨 2129 hun4 +觩 2329 qiu2 +觪 2024 xing1 +觫 2529 su4 +觬 2721 ni2 +觭 2422 ji1qi3qi2 +觮 2729 lu4 +觯觶 2825 zhi4zhi1 +觰 2426 zha1 +觱 7322 bi4 +觲 2825 xing1 +觳 4724 hu2 +觴觞 2822 shang1 +觵 2428 gong1 +觶觯 2625 zhi4zhi1 +觷 7722 xue2 +觸触 2622 chu4 +觹 2022 xi1wei2 +觺 2722 yi2 +觻 2229 lu4 +觼 2724 jue2 +觽 2222 xi1 +觾 2423 yan4 +觿 2222 xi1 +言 0060 yan2 u 261 +訁讠 0060 yan2 +訂订 0162 ding4 +訃讣 0360 fu4 +訄 4001 qiu2 +訅 0461 qiu2 +訆 0260 jiao4 +訇 2762 hong1jun4heng1 +計计 0460 ji4 +訉 0761 fan4 +訊讯 0761 xun4 +訋 0762 diao4 +訌讧 0161 hong2hong4 +訍 0764 cha4 +討讨 0460 tao3 +訏 0164 xu1xu3 +訐讦 0164 jie2ji4 +訑 0461 yi2dan4 +訒讱 0762 ren4 +訓训 0260 xun4 +訔 2260 yin2 +訕讪 0267 shan4 +訖讫 0861 qi4 +託讬 0261 tuo1 +記记 0761 ji4 +訙 0561 xun4 +訚誾 3760 yin2 +訛讹 0461 e2 +訜 0862 fen1 +訝讶 0164 ya4 +訞 0268 yao1 +訟讼 0863 song4rong2 +訠 0260 shen3 +訡 0862 yin2yin3jin4 +訢䜣 0262 xin1xi1yin2 +訣诀 0568 jue2 +訤 0464 xiao2na2 +訥讷 0462 ne4na4 +訦 0461 chen2shen2 +訧 0361 you2 +訨 0161 zhi3 +訩讻 0467 xiong1 +訪访 0062 fang3 +訫 0360 xin4 +訬 0962 chao1miao3 +設设 0764 she4 +訮 0164 xian1 +訯 0764 sha3 +訰 0561 tun2 +許许 0864 xu3hu3 +訲 0560 yi4 +訳 0768 yi4 +訴诉 0264 su4 +訵 0660 chi1 +訶诃 0162 he1 +訷 0560 shen1 +訸 0269 he2 +訹 0369 xu4 +診诊 0862 zhen3 +註注 0061 zhu4 +証 0161 zheng4 +訽 0762 gou4 +訾 2260 zi1 +訿 0261 zi3zi1 +詀 0166 zhan1che4 +詁诂 0466 gu3 +詂 0460 fu4 +詃 0063 quan3 +詄 0568 die2 +詅 0863 ling2 +詆诋 0264 di3ti4 +詇 0568 yang4 +詈 6060 li4 +詉 0764 nao2 +詊 0965 pan4 +詋 0661 zhou4 +詌 0467 gan4 +詍 0461 yi4 +詎讵 0161 ju4 +詏 0462 ao4 +詐诈 0861 zha4 +詑 0361 tuo2 +詒诒 0366 yi2dai4tai2 +詓 0463 qu3 +詔诏 0766 zhao4zhao1 +評评 0164 ping2 +詖诐 0464 bi4 +詗诇 0762 xiong4 +詘诎 0267 qu1chu4qu4 +詙 0364 ba2 +詚 0661 da2 +詛诅 0761 zu3 +詜 0264 tao1 +詝 0362 zhu3 +詞词 0762 ci2 +詟 4360 zhe2 +詠咏 0369 yong3 +詡诩 0762 xu3 +詢询 0762 xun2 +詣诣 0266 yi4 +詤 0861 huang3 +詥 0866 he2 +試试 0364 shi4 +詧 2760 cha2 +詨 0064 jiao1 +詩诗 0464 shi1 +詪 0763 hen3 +詫诧 0361 cha4du4 +詬诟 0266 gou4hou4 +詭诡 0761 gui3 +詮诠 0861 quan2 +詯 0660 hui4 +詰诘 0466 jie2 +話话 0266 hua4 +該该 0068 gai1 +詳详 0865 xiang2yang2 +詴 0462 wei1 +詵诜 0461 shen1 +詶 0260 chou2zhou4 +詷 0762 tong2 +詸 0969 mi2 +詹 2726 zhan1shan4dan4 2919 +詺 0766 ming4 +詻 0766 e4luo4 +詼诙 0468 hui1 +詽 0164 yan2 +詾 0762 xiong1 +詿诖 0464 gua4 +誀 0164 er4 +誁 0464 beng3 +誂 0261 tiao3diao4 +誃 0762 chi3chi2yi2 +誄诔 0569 lei3 +誅诛 0569 zhu1 +誆诓 0161 kuang1 +誇夸 0462 kua1 +誈 0161 wu2 +誉譽 9060 yu4 1640 +誊謄 9060 teng2 +誋 0763 ji4 +誌志 0463 zhi4 +認认 0763 ren4 +誎 0569 su4 +誏 0363 lang3 +誐 0365 e2 +誑诳 0161 kuang2kuang4 +誒诶 0368 ei1ei2ei3ei4 +誓 5260 shi4 1921 +誔 0264 ting3 +誕诞 0264 dan4 +誖 0464 bo2bei4 +誗 0260 chan2 +誘诱 0262 you4 +誙 0161 heng2keng1 +誚诮 0962 qiao4 +誛 0764 qin1 +誜 0364 shua4 +誝 0866 an1 +語语 0166 yu3yu4 +誟 0464 xiao4 +誠诚 0365 cheng2 +誡诫 0365 jie4 +誢 0661 xian4 +誣诬 0161 wu1wu2 +誤误 0668 wu4 +誥诰 0466 gao4 +誦诵 0762 song4 +誧 0362 pu3bu1 +誨诲 0865 hui4 +誩 0066 jing4 +說说 0861 shuo1shui4 +誫 0163 zhen4 +説说 0861 shuo1shui4 +読 0461 du2 +誮 0461 hua1 +誯 0666 chang4 +誰谁 0061 shui2shei2 +誱 0568 jie2 +課课 0669 ke4 +誳 0767 qu1 +誴 0369 cong2 +誵 0462 xiao2 +誶谇 0064 sui4 +誷 0762 wang3 +誸 0063 xuan2 +誹诽 0161 fei3 +誺 0469 chi1 +誻 0266 ta4 +誼谊 0361 yi4yi2 +誽 0762 na2 +誾訚 7760 yin2 +調调 0762 diao4tiao2 +諀 0664 pi3 +諁 0764 chuo4 +諂谄 0767 chan3 +諃 0469 chen1 +諄谆 0064 zhun1zhun4 +諅 4460 ji1 +諆 0468 qi1ji1 +談谈 0968 tan2 +諈 0261 zhui4 +諉诿 0264 wei3 +諊 0762 ju2 +請请 0562 qing3 +諌 0569 jian4dong3 +諍诤 0765 zheng1zheng4 +諎 0466 ze2 +諏诹 0164 zou1zhou1 +諐 2660 qian1 +諑诼 0163 zhuo2 +諒谅 0069 liang4liang2 +諓 0365 jian4 +諔 0764 zhu4 +諕 0161 hao2xia4 +論论 0862 lun4lun2 +諗谂 0863 shen3nie4 +諘 0563 biao3 +諙 0266 huai4 +諚 0368 pian2 +諛谀 0768 yu2 +諜谍 0469 die2xie4 +諝谞 0762 xu3 +諞谝 0362 pian3pian2 +諟 0668 shi4 +諠 0361 xuan1xuan3 +諡 0861 shi4 +諢诨 0765 hun4 +諣 0762 hua4 +諤谔 0662 e4 +諥 0261 zhong4 +諦谛 0062 di4ti2 +諧谐 0266 xie2 +諨 0166 fu2 +諩 0861 pu3 +諪 0062 ting2 +諫谏 0569 jian4 +諬 2360 qi3 +諭谕 0862 yu4tou3 +諮谘 0766 zi1 +諯 0262 chuan2 +諰 0663 xi3 +諱讳 0465 hui4 +諲 0161 yin1 +諳谙 0066 an1tou3 +諴 0365 xian2 +諵 0462 nan2 +諶谌 0461 chen2shen2 +諷讽 0761 feng3feng1feng4 +諸诸 0466 zhu1chu2 +諹 0662 yang2 +諺谚 0062 yan4 +諻 0661 heng1 +諼谖 0264 xuan1 +諽 0465 ge2 +諾诺 0466 nuo4 +諿 0664 qi4 +謀谋 0469 mou2 +謁谒 0662 ye4 +謂谓 0662 wei4 +謃 0661 xing1 +謄誊 7926 teng2 +謅诌 0762 zou1zhou1chao3chou1 +謆 0362 shan4 +謇 3060 jian3 +謈 6060 bo2 +謉 0661 kui4 +謊谎 0461 huang3 +謋 0569 huo4 +謌 0162 ge1 +謍 9960 ying2hong1 +謎谜 0963 mi2mei4mi4 +謏 0764 xiao3 +謐谧 0361 mi4 +謑 0268 xi4xi3 +謒 0866 qiang1 +謓 0468 chen1 +謔谑 0161 nue4xue4 +謕 0261 ti2 +謖谡 0664 su4 +謗谤 0062 bang4 +謘 0764 chi2 +謙谦 0863 qian1qian4zhan4 +謚谥 0861 shi4yi4xi4 +講讲 0565 jiang3 +謜 0169 yuan4quan2 +謝谢 0460 xie4 +謞 0062 xue4xiao4 +謟 0267 tao1 +謠谣 0767 yao2 +謡谣 0267 yao2 +謢 0064 lu1 +謣 0762 yu2 +謤 0169 biao1 +謥 0663 cong4 +謦 4760 qing4qing3 +謧 0062 li2 +謨谟 0468 mo2 +謩 4460 mo4mo2 +謪 0062 shang1 +謫谪 0062 zhe2ze2 +謬谬 0762 miu4 +謭谫 0862 jian3 +謮 0568 ze2 +謯 0161 jie1zha1zha3zu3 +謰 0563 lian2 +謱 0564 lou2lv3 +謲 0362 can1 +謳讴 0161 ou1xu2 +謴 0768 guan4 +謵 0766 xi2 +謶 0063 zhuo2 +謷 5860 ao2ao4 +謸 0864 ao2ao4 +謹谨 0461 jin3 +謺 4560 zhe2 +謻 0762 yi2chi2 +謼 0164 hu4hu1 +謽 1360 jiang4 +謾谩 0664 man2man4 +謿 0762 chao2zhao1 +譀 0864 han4 +譁 0465 hua2 +譂 0665 chan3 +譃 0161 xu1 +譄 0866 zeng1 +譅䜧 0761 se4 +譆 0466 xi1 +譇 0466 she1 +譈 0864 dui4 +證证 0261 zheng4 +譊 0461 nao2 +譋 0762 lan2 +譌 0262 e2 +譍 0026 ying4ying2 +譎谲 0762 jue2 +譏讥 0265 ji1 +譐 0864 zun3 +譑 0262 jiao3 +譒 0266 bo4 +譓 0563 hui4 +譔 0768 zhuan4 +譕 0863 mu2 +譖谮 0566 zen4jian4 +譗 0866 zha2 +識识 0365 shi2zhi4 +譙谯 0063 qiao2qiao4 +譚谭 0164 tan2 +譛 0566 zen4 +譜谱 0866 pu3 +譝 0761 sheng2 +譞 0663 xuan1 +譟 0669 zao4 +譠 0061 tan1 +譡 0966 dang3 +譢 0863 sui4 +譣 0868 qian1 +譤 0864 ji1 +譥 2860 jiao4 +警 4860 jing3 813 +譧 0063 lian2 +譨 0563 nou2nong2 +譩 0063 yi1 +譪 0462 ai4 +譫谵 0766 zhan1 +譬 7060 pi4 2595 +譭 0764 hui3 +譮 0866 hua4 +譯译 0664 yi4 +議议 0865 yi4 +譱 8066 shan4 +譲 0063 rang4 +譳 0162 nou4 +譴谴 0563 qian3 +譵 0460 zhui4 +譶 0066 ta4 +護护 0464 hu4 +譸诪 0464 zhou1 +譹 0063 hao2xia4 +譺 0768 ye4 +譻 6660 ying1 +譼 7860 jian4jian1kan4 +譽誉 7760 yu4 +譾谫 0862 jian3 +譿 0463 hui4 +讀读 0468 du2dou4 +讁 0063 zhe2 +讂 0764 xuan4 +讃 0568 zan4 +讄 0666 lei3 +讅 0366 shen3 +讆 2160 wei4 +讇 0762 chan3 +讈 0161 li4 +讉 0563 yi2 +變变 2240 bian4 +讋詟 0160 zhe2she4 +讌䜩 0463 yan4 +讍 0161 e4 +讎雠 2021 chou2 +讏 2160 wei4 +讐 2060 chou2 +讑 0862 yao4 +讒谗 0761 chan2 +讓让 0063 rang4 +讔 0263 yin3 +讕谰 0762 lan2 +讖谶 0365 chen4chan4 prophecy omen +讗 0262 huo4 +讘 0164 zhe2 +讙 0461 huan1xuan1 +讚 0468 zan4 +讛 0463 yi4 +讜谠 0963 dang3dang4 +讝 0664 zhan1 +讞谳 0368 yan4 +讟 0066 du2 +讠訁 3070 yan2 +计計 3470 ji4 276 +订訂 3172 ding4 subscribe 1561 +讣訃 3370 fu4 +认認 3870 ren4 268 +讥譏 3771 ji1 2991 +讦訐 3174 jie2 +讧訌 3171 hong2hong4 +讨討 3470 tao3 692 +让讓 3171 rang4 let 302 +讪訕 3277 shan4 3397 +讫訖 3871 qi4 +讬託 3271 tuo1 +训訓 3270 xun4 1066 +议議 3470 yi4 440 +讯訊 3771 xun4 1211 +记記 3771 ji4 226 +讱訒 3772 ren4 +讲講 3570 jiang3 speak 552 +讳諱 3572 hui4 2833 +讴謳 3171 ou1 +讵詎 3171 ju4 +讶訝 3174 ya4 2122 +讷訥 3472 ne4na4 3513 +许許 3874 xu3 245 +讹訛 3471 e2 3775 +论論 3871 lun4lun2 299 +讻訩 3477 xiong1 +讼訟 3873 song4 litigation 2756 +讽諷 3771 feng1 satirize 2483 +设設 3774 she4 395 +访訪 3072 fang3 940 +诀訣 3578 jue2 2713 +证證 3171 zheng4 certificate 477 +诂詁 3476 gu3 +诃訶 3172 he1 3779 +评評 3174 ping2 1044 +诅詛 3771 zu3 3551 +识識 3678 shi2zhi4 331 +诇詗 3772 xiong4 +诈詐 3871 zha4 2228 +诉訴 3274 su4 566 +诊診 3872 zhen3 2019 +诋詆 3274 di3 +诌謅 3777 zou1zhou1 +词詞 3772 ci2 word 819 +诎詘 3277 qu4qu1 +诏詔 3776 zhao4 3330 +诐詖 3474 bi4 +译譯 3775 yi4 1602 +诒詒 3376 yi2 +诓誆 3171 kuang1 +诔誄 3579 lei3 +试試 3374 shi4 try 545 +诖詿 3471 gua4 +诗詩 3474 shi1 poem 852 +诘詰 3476 jie2 3929 +诙詼 3478 hui1 +诚誠 3375 cheng2 honest 1102 +诛誅 3579 zhu1 3161 +诜詵 3471 shen1 +话話 3276 hua4 145 +诞誕 3274 dan4 2123 +诟詬 3276 gou4 +诠詮 3871 quan2 3928 +诡詭 3771 gui3 2708 +询詢 3772 xun2 1406 +诣詣 3276 yi4 3172 +诤諍 3775 zheng1 +该該 3078 gai1 250 +详詳 3875 xiang2 1377 +诧詫 3371 cha4 2730 +诨諢 3775 hun4 +诩詡 3772 xu3 +诪譸 3574 zhou1 +诫誡 3375 jie4 2989 +诬誣 3171 wu2wu1 3104 +语語 3176 yu3yu4 327 +诮誚 3972 qiao4 +误誤 3678 wu4 880 +诰誥 3476 gao4 +诱誘 3272 you4 1708 +诲誨 3875 hui4 3491 +诳誑 3171 kuang2kuang4 +说說 3871 shuo1 say 39 +诵誦 3772 song4 2443 +诶誒 3378 ei1ei2ei3ei4 +请請 3572 qing3 please 320 +诸諸 3476 zhu1 1009 +诹諏 3774 zou1 +诺諾 3476 nuo4 1253 +读讀 3478 du2dou4 read 705 +诼諑 3173 zhuo2 +诽誹 3171 fei3 3973 +课課 3679 ke4 lesson class 1326 +诿諉 3274 wei3 +谀諛 3778 yu2 +谁誰 3071 shui2shei2 who 520 +谂諗 3873 shen3 +调調 3772 diao4tiao2 tone 393 +谄諂 3777 chan3 +谅諒 3079 liang4liang2 2071 +谆諄 3074 zhun1zhun4 3558 +谇誶 3074 sui4 +谈談 3978 tan2 420 +谉 3375 shen3 +谊誼 3371 yi2yi4 2010 +谋謀 3479 mou2 1213 +谌諶 3471 chen2 +谍諜 3479 die2 3626 +谎謊 3471 huang3 2472 +谏諫 3579 jian4 3544 +谐諧 3276 xie2 2509 +谑謔 3171 nue4xue4 3763 +谒謁 3672 ye4 3504 +谓謂 3672 wei4 862 +谔諤 3672 e4 +谕諭 3872 yu4 3659 +谖諼 3274 xuan1 +谗讒 3773 chan2 +谘諮 3776 zi1 +谙諳 3076 an1 3884 +谚諺 3072 yan4 3735 +谛諦 3072 di4ti2 3606 +谜謎 3973 mi2mei4mi4 riddle 2899 +谝諞 3372 pian2pian3 +谞諝 3772 xu3 +谟謨 3478 mo2 +谠讜 3971 dang3 +谡謖 3674 su4 +谢謝 3470 xie4 638 +谣謠 3277 yao2 2546 +谤謗 3072 bang4 3683 +谥謚 3871 shi4 +谦謙 3873 qian1qian4 1957 +谧謐 3371 mi4 quiet 3952 +谨謹 3471 jin3 1844 +谩謾 3674 man2man4 +谪謫 3072 zhe2 +谫謭 3872 jian3 +谬謬 3772 miu4 2868 +谭譚 3174 tan2 2236 +谮譖 3176 zen4jian4 +谯譙 3073 qiao2qiao4 +谰讕 3772 lan2 +谱譜 3876 pu3 2104 +谲譎 3772 jue2 +谳讞 3378 yan4 +谴譴 3573 qian3 3146 +谵譫 3776 zhan1 +谶讖 3375 chen4 +谷 8060 gu3 valley grain corn 1097 +谸 2846 qian1 +谹 8463 hong2 +谺 8164 xia1 +谻 8761 jue2 +谼 8468 hong2 +谽 8866 han1 +谾 8361 hong1 +谿 2886 xi1 +豀 8268 xi1 +豁 3866 huo1huo4hua2 2769 +豂 8762 liao2 +豃 8864 han3 +豄 8468 du2 +豅 8161 long2 +豆 1010 dou4 u bean peas 1698 +豇 1111 jiang1 +豈岂 2210 qi3kai3 +豉 1414 chi3shi4 +豊 5510 li3feng1 +豋 2710 deng1 +豌 1311 wan1 +豍 1614 bi1 +豎竖 7710 shu4 +豏 1813 xian4 +豐丰 5510 feng1 +豑 5812 zhi4 +豒 5812 zhi4 +豓 5411 yan4 +豔 5411 yan4 +豕 1023 shi3 u +豖 1023 chu4 +豗 1121 hui1 +豘 1521 tun2 +豙 0023 yi4 +豚 7123 tun2dun1 3898 +豛 1724 yi4 +豜 1124 jian1 +豝 1721 ba1 +豞 1722 hou4 +豟 1321 e4 +豠 1721 cu2 +象 2723 xiang4 elephant 286 +豢 9023 huan4 +豣 1124 jian1yan4 +豤 1723 ken3 +豥 1028 gai1 +豦 2123 qu2 +豧 1422 fu1 +豨 1422 xi1 +豩 1123 bin1 +豪 0023 hao2 1354 +豫 1723 yu4xu4 2015 +豬猪 1426 zhu1 +豭 1724 jia1 +豮豶 1428 fen2 +豯 1228 xi1 +豰 4724 hu4 +豱 1621 wen1 +豲 1129 huan2yuan2 +豳 2277 bin1 +豴 1022 di2 +豵 1828 zong1 +豶豮 1428 fen2 +豷 1421 yi4 +豸 2022 zhi4 u +豹 2722 bao4 2513 +豺 2420 chai2 +豻 2124 an4han4 +豼 2221 pi2 +豽 2422 na4 +豾 2121 pi1 +豿 2722 gou3 +貀 2227 na4 +貁 2328 you4 +貂 2726 diao1 3817 +貃 2620 mo4 +貄 2520 si4 +貅 2429 xiu1 +貆 2121 huan2huan1 +貇 2723 kun1 +貈 2724 he2hao2ma4mo4 +貉 2726 he2hao2mo4ma4 +貊 2126 mo4 +貋 2624 han4 +貌 2621 mao4 1212 +貍 2621 li2mai2 +貎 2721 ni2 +貏 2624 bi3 +貐 2822 yu3 +貑 2724 jia1 +貒 2222 tuan1 +貓猫 2426 mao1 +貔 2621 pi2 +貕 2228 xi1 +貖 2821 e4 +貗 2524 ju4 +貘 2428 mo4 +貙䝙 2121 chu1 +貚 2624 tan2 +貛 2421 huan1 +貜 2624 jue2 +貝贝 6080 bei4 u +貞贞 2180 zhen1 +貟贠 2380 yuan2yun2 +負负 2780 fu4 +財财 6480 cai2 +貢贡 1080 gong4 +貣 4380 te4 +貤 6481 yi2yi4 +貥 6081 hang2 +貦 6181 wan4 +貧贫 8080 pin2 +貨货 2480 huo4 +販贩 6284 fan4 +貪贪 8080 tan1 +貫贯 7780 guan4wan1 +責责 5080 ze2zhai4 +貭 7228 zhi2 +貮 1384 er4 +貯贮 6382 zhu3zhu4 +貰贳 4480 shi4 +貱 6484 bi4 +貲赀 2280 zi1 +貳贰 4380 two +貴贵 5080 gui4 +貵 2380 pian3 +貶贬 6283 bian3 +買买 6080 mai3 +貸贷 2380 dai4te4 +貹 6581 sheng4 +貺贶 6681 kuang4 +費费 5580 fei4 +貼贴 6186 tie1 +貽贻 6386 yi2 +貾 6284 chi2 +貿贸 7780 mao4 +賀贺 4680 he4 +賁贲 4080 bi4ben1 +賂赂 6786 lu4 +賃赁 2280 lin4ren4 +賄贿 6482 hui4 +賅赅 6088 gai1 +賆 6884 pian2 +資资 3780 zi1zi4 +賈贾 1080 jia3jia4gu3 +賉 6781 xu4 +賊贼 6385 zei2 +賋 6084 jiao3 +賌 0080 gai4gai1 +賍 6081 zang1 +賎 6385 jian4 +賏 6688 ying4 +賐 6384 xun4 +賑赈 6183 zhen4 +賒赊 6889 she1sha1 +賓宾 3080 bin1bin4 +賔 3028 bin1bin4 +賕赇 6389 qiu2 +賖 6889 she1 +賗 6580 chuan4 +賘 6081 zang1 +賙赒 6782 zhou1 +賚赉 4080 lai4 +賛 5580 zan4 +賜赐 6682 ci4si4 +賝 6789 chen1 +賞赏 9080 shang3 +賟 6588 tian3 +賠赔 6086 pei2 +賡赓 0028 geng1 +賢贤 7780 xian2 +賣卖 4080 mai4 +賤贱 6385 jian4 +賥 6084 sui4 +賦赋 6384 fu4 +賧赕 6988 tan4tan3 +賨 3080 cong2 +賩 6389 cong2 +質质 7280 zhi4zhi2 +賫赍 4080 ji1 +賬账 6183 zhang4 +賭赌 6486 du3 +賮 5080 jin4 +賯 6784 xiong1min2 +賰䞐 6586 shun3 +賱 6785 yun3 +賲 2680 bao3 +賳 6385 zai1 +賴赖 5798 lai4 +賵赗 6686 feng4 +賶 6886 cang4 +賷 4080 ji1qi2 +賸 7928 sheng4 +賹 6881 ai4 +賺赚 6883 zhuan4 +賻赙 6384 fu4 +購购 6585 gou4 +賽赛 3080 sai4 +賾赜 7578 ze2 +賿 6782 liao2 +贀 7780 wei4 +贁 6884 bai4 +贂 6382 chen3 +贃 6583 zhuan4zuan4 +贄贽 4580 zhi4zhi2 +贅赘 4880 zhui4 +贆 6388 biao1 +贇赟 0380 yun1 +贈赠 6886 zeng4 +贉 6184 tan3dan3dan4 +贊赞 2480 zan4 +贋赝 7128 yan4 +贌 6288 pu2 +贍赡 6786 shan4dan4 +贎 6482 wan4 +贏赢 0021 ying2 +贐赆 6581 jin4 +贑 0148 gan4 +贒 7580 xian2 +贓赃 6385 zang1 +贔赑 6088 bi4 +贕 7428 du2 +贖赎 6488 shu2shu4 +贗赝 7128 yan4 +贘 6988 shang3 +贙 2180 xuan4 +贚 6181 long4 +贛赣 0748 gan4 +贜赃 7485 zang1 +贝貝 7780 bei4 1161 +贞貞 2180 zhen1 1920 +负負 2780 fu4 negative 606 +贠貟 2380 yuan2yun2 +贡貢 1080 gong4 1685 +财財 7480 cai2 818 +责責 5080 ze2zhai4 601 +贤賢 2780 xian2 1534 +败敗 7884 bai4 929 +账賬 7283 zhang4 2340 +货貨 2480 huo4 1026 +质質 7228 zhi2zhi4 668 +贩販 7284 fan4 2259 +贪貪 8080 tan1 greedy 1779 +贫貧 8080 pin2 1216 +贬貶 7283 bian3 2795 +购購 7782 gou4 1679 +贮貯 7381 zhu3zhu4 2905 +贯貫 7780 guan4wan1 1403 +贰貳 4380 er4 two 3756 +贱賤 7385 jian4 inexpensive 2284 +贲賁 4080 bi4ben1 +贳貰 4480 shi4 +贴貼 7186 tie1 1219 +贵貴 5080 gui4 expensive noble 673 +贶貺 7681 kuang4 +贷貸 2380 dai4te4 2307 +贸貿 7780 mao4 1939 +费費 5580 fei4 fee 498 +贺賀 4680 he4 1535 +贻貽 7386 yi2 3497 +贼賊 7385 zei2 thief 1899 +贽贄 5580 zhi4 +贾賈 1080 jia3gu3jia4 1586 +贿賄 7482 hui4 2753 +赀貲 2280 zi1 +赁賃 2280 ren4lin4 3240 +赂賂 7786 lu4 3208 +赃贓 7081 zang1 2973 +资資 3780 zi1 567 +赅賅 7088 gai1 +赆贐 7783 jin4 +赇賕 7389 qiu2 +赈賑 7183 zhen4 3742 +赉賚 5080 lai4 +赊賒 7889 she1sha1 +赋賦 7384 fu4 1789 +赌賭 7486 du3 gamble bet 1737 +赍賫 4080 ji1qi2 +赎贖 7488 shu2 3098 +赏賞 9080 shang3 1223 +赐賜 7682 si4ci4 1882 +赑贔 7788 bi4 +赒賙 7782 zhou1 +赓賡 0028 geng1 +赔賠 7086 pei2 2016 +赕賧 7988 tan4tan3 +赖賴 5798 lai4 1322 +赗賵 7686 feng4 +赘贅 5880 zhui4 3153 +赙賻 7384 fu4 +赚賺 7883 zhuan4 2186 +赛賽 3080 sai4 1118 +赜賾 7578 ze2 +赝贋 7128 yan4 +赞贊 2480 zan4 1146 +赟贇 0380 yun1 +赠贈 7886 zeng4 2009 +赡贍 7786 shan4dan4 3835 +赢贏 0021 ying2 1781 +赣贛 0748 gan4 +赤 4023 chi4 u red 1492 +赥 4728 xi4 +赦 4824 she4 2963 +赧 4724 nan3 +赨 4523 xiong2tong2 +赩 4721 xi4 +赪赬 4128 cheng1 +赫 4423 he4 1629 +赬赪 4128 cheng1 +赭 4426 zhe3 +赮 4724 xia2 +赯 4026 tang2 +走 4080 zou3 u walk 196 +赱 4030 zou3 +赲 4480 li4 +赳 4280 jiu3jiu1jiu4 +赴 4380 fu4 1707 +赵趙 4480 zhao4 1085 +赶趕 4280 gan3 772 +起 4780 qi3 76 +赸 4280 shan4 +赹 4780 qiong2 +赺 4880 qin2 +赻 4980 xian3 +赼 4780 ci1 +赽 4580 jue2 +赾 4280 qin3 +赿 4280 chi2di4 +趀 4580 ci1 +趁 4880 chen4 2103 +趂 4780 chen4 +趃 4580 die2 +趄 4780 ju1qie4 +超 4780 chao1 822 +趆 4280 di1 +趇 4080 se4 +趈 4180 zhan1 +趉 4280 zhu2 +越 4380 yue4 over 429 +趋趨 4780 qu1cu4 1632 +趌 4480 jie2 +趍 4780 chi2qu1 +趎 4580 chu2 +趏 4280 gua1 +趐 4780 xue4 +趑 4780 ci1zi1ci4 +趒 4280 tiao2 +趓 4780 duo3 +趔 4280 lie4 +趕赶 4680 gan3 +趖 4880 suo1 +趗 4680 cu4 +趘 4780 xi2 +趙赵 4980 zhao4 +趚 4580 su4 +趛 4880 yin3 +趜 4780 ju2 +趝 4880 jian4 +趞 4480 que4 +趟 4980 tang4tang1 2235 +趠 4180 chuo4chao4 +趡 4080 cui3 +趢 4780 lu4 +趣 4180 qu4cu4 990 +趤 4380 dang4 +趥 4880 qiu1 +趦 4780 zi1 +趧 4680 ti2 +趨趋 4780 qu1cu4qu4cou3 +趩 4680 chi4 +趪 4480 huang2 +趫 4280 qiao2 +趬 4480 qiao2qiao1 +趭 4080 yao4jiao4 +趮 4680 zao4 +趯 4780 ti4yue4 +趰 4180 er3 +趱趲 4480 zan3 +趲趱 4480 zan3zan4zu1 +足 6080 zu2ju4 u foot 366 +趴 6810 pa1 2995 +趵 6712 bao4bo1 +趶 6114 ku4 +趷 6811 ke1 +趸躉 1080 dun3 +趹 6518 jue2gui4 +趺 6518 fu1 +趻 6812 chen3 +趼 6114 jian3yan4 +趽 6012 fang4 +趾 6111 zhi3 3388 +趿 6714 sa4ta1qi4 +跀 6712 yue4 +跁 6711 pa2 +跂 6414 qi2qi3qi4 +跃躍 6218 yue4 1312 +跄蹌 6811 qiang1qiang4 3511 +跅 6214 tuo4 +跆 6316 tai2 +跇 6411 yi4 +跈 6812 nian3jian4 +跉 6813 ling2 +跊 6519 mei4 +跋 6314 ba2bei4 2988 +跌 6518 die1die2tu2 1704 +跍 6416 ku1 +跎 6311 tuo2 +跏 6610 jia1 +跐 6211 ci3cai3 +跑 6711 pao3pao2 run 825 +跒 6112 qia3 +跓 6011 zhu4 +跔 6712 ju1 +跕 6116 die2tie1 +跖 6116 zhi2zhi1 +跗 6410 fu1 +跘 6915 pan2 +跙 6711 ju3 +跚 6714 shan1 +跛 6414 bo3bi4po1 3895 +跜 6711 ni2 +距 6111 ju4 1428 +跞躒 6219 li4luo4 +跟 6713 gen1 471 +跠 6618 yi2 +跡迹 6013 ji1ji4 +跢 6712 dai4 +跣 6411 xian3xian1sun3 +跤 6014 jiao1qiao1 3590 +跥 6719 duo4 +跦 6519 zhu1 +跧 6811 quan2zun1zhuan1 +跨 6412 kua4 1499 +跩 6510 zhuai3shi4 +跪 6711 gui4 kneel 1890 +跫 1780 qiong2qiong1qiang1 +跬 6411 kui3xie4 +跭 6714 xiang2 +跮 6111 chi4die2 +路 6716 lu4luo4 road 194 +跰 6814 beng4pian2 +跱 6414 zhi4shi4 +跲 6816 jia2 +跳 6211 tiao4tao2 788 +跴 6116 cai3 +践踐 6315 jian4 1876 +跶躂 6413 ta4da5 +跷蹺 6511 qiao1 3649 +跸蹕 6214 bi4 +跹躚 6213 xian1 +跺 6719 duo4 3616 +跻躋 6012 ji1 3736 +跼 6712 ju2 +跽 6713 ji4 +跾 2880 shu2 +跿 6418 tu2 +踀 6618 chu4 +踁 6111 jing4 +踂 6211 nie4 +踃 6912 xiao1 +踄 6112 bo2 +踅 4280 chi4xue2 +踆 6314 qun1cun1cun2 +踇 6815 mou3 +踈 6519 shu1 +踉 6313 liang2 3532 +踊踴 6712 yong3 3530 +踋 6712 jiao3jue2 +踌躊 6514 chou2 3206 +踍 6414 qiao1 +踎 6116 mou2 +踏 6216 ta4ta1 stamp 1553 +踐践 6315 jian4 +踑 6418 qi2ji1 +踒 6214 wo1 +踓 6011 wei3 +踔 6114 chuo1 +踕 6518 jie2 +踖 6416 ji2 +踗 6813 nie1 +踘 6712 ju2ju1 +踙 6714 ju1 +踚 6812 lun2 +踛 6411 lu4 +踜 6414 leng4 +踝 6619 huai2hua4 +踞 6716 ju4 3622 +踟 6610 chi2 +踠 6311 wan3 +踡 6911 quan2 +踢 6612 ti1die2 kick 2131 +踣 6016 bo2pou4 +踤 6014 zu2cui4 +踥 6014 qie4 +踦 6412 ji3ji1qi1yi3 +踧 6714 cu4di2 +踨 6818 zong1 +踩 6219 cai3kui2 2634 +踪蹤 6319 zong1 1437 +踫 6811 peng4 +踬躓 6218 zhi4 +踭 6715 zheng1 +踮 6016 dian3 +踯躑 6712 zhi2 +踰 6812 yu2 +踱 6014 duo4duo2chuo4 3178 +踲 6216 dun4 +踳 6516 chun3 +踴踊 6712 yong3 +踵 6211 zhong3zhong4 heel 3647 +踶 6618 di4chi2ti2zhi4 +踷 6416 zhe3 +踸 6411 chen3 +踹 6212 chuai4shuan4duan4 +踺 6514 jian4 +踻 6712 gua1 +踼 6612 tang2 +踽 6212 ju3 +踾 6116 fu2 +踿 6918 zu2 +蹀 6419 die2 +蹁 6712 pian2 +蹂 6719 rou2 +蹃 6416 nuo4 +蹄 6012 ti2di4 2692 +蹅 6411 cha3 +蹆 6718 tui3 +蹇 3080 jian3qian1 +蹈 6217 dao3dao4 2448 +蹉 6811 cuo1chuai4 +蹊 6218 xi1qi1xi2 3506 +蹋 6612 ta4 3703 +蹌跄 6816 qiang1qiang4 +蹍 6713 zhan3nian3 +蹎 6418 dian1 +蹏 6211 ti2di4 +蹐 6212 ji2 +蹑躡 6114 nie4 3841 +蹒蹣 6412 man2pan2 +蹓 6716 liu1liu4 +蹔 5280 zhan4zan4 +蹕跸 6615 bi4 +蹖 6517 chong1 +蹗 6011 lu4 +蹘 6712 liao2 +蹙 5380 cu4 3581 +蹚 6911 tang1 +蹛 6412 dai4zhi4 +蹜 6316 suo1su4 +蹝 6118 xi3 +蹞 6118 kui3 +蹟 6518 ji1ji4 +蹠 6013 zhi2 +蹡 6214 qiang1qiang4 +蹢 6012 di2zhi2 +蹣蹒 6412 pan2man2liang3 +蹤踪 6818 zong1 +蹥 6513 lian2 +蹦 6212 beng4 3109 +蹧 6416 zao1 +蹨 6313 nian3 +蹩 9730 bie2 +蹪 6518 tui2 +蹫 6712 ju2 +蹬 6211 deng4deng1 3223 +蹭 6816 ceng4ceng2 3642 +蹮 6111 xian1 +蹯 6216 fan2fan1 +蹰躕 6114 chu2 +蹱 6011 zhong1 +蹲 6814 dun1 2459 +蹳 6214 bo1 +蹴 6311 cu4zu2 +蹵 0380 zu2cu4 +蹶 6118 jue2jue3gui4 +蹷 7128 jue2 +蹸 6915 lin4 +蹹 6812 ta4 +蹺跷 6411 qiao1qiao4 +蹻 6212 qiao1jue2 +蹼 6218 pu2pu3 +蹽 6419 liao1 +蹾 6814 dun1 +蹿躥 6315 cuan1 +躀 6718 kuang4 +躁 6619 zao4 2451 +躂跶 6413 ta4da5 +躃 6014 bi4 +躄 6080 bi4 +躅 6612 zhu2zhuo2 +躆 6113 ju4 +躇 6416 chu2chuo4 3228 +躈 6814 qiao4 +躉趸 4480 dun3 +躊踌 6414 chou2 +躋跻 6012 ji1 +躌 6815 wu3 +躍跃 6711 yue4ti4 +躎䟢 6112 nian3 +躏躪 6412 lin4 +躐 6211 lie4 +躑踯 6712 zhi2 +躒跞 6219 li4luo4yue4 +躓踬 6218 zhi4zhi1 +躔 6011 chan2zhan4 +躕蹰 6014 chu2 +躖 6217 duan4 +躗 2180 wei4 +躘 6111 long2 +躙 6712 lin4 +躚跹 6113 xian1 +躛 2180 wei4 +躜躦 6418 zuan1 +躝 6712 lan2 +躞 6014 xie4 +躟 6013 rang2 +躠 4480 xie3sa3xie4 +躡蹑 6114 nie4 +躢 6712 ta4 +躣 6611 qu2 +躤 6416 jie4ji2 +躥蹿 6311 cuan1 +躦躜 6418 zuan1cuo2 +躧 6111 xi3 +躨 6814 kui2 +躩 6614 jue2 +躪躏 6712 lin4 +身 2740 shen1 u 149 +躬 2722 gong1 2309 +躭 2421 dan1 +躮 2822 fen1 +躯軀 2121 qu1 2183 +躰 2523 ti3 +躱 2729 duo3 +躲 2729 duo3 1674 +躳 2626 gong1 +躴 2323 lang2 +躵 2723 ren3 +躶 2629 luo3 +躷 2224 ai3 +躸 2422 ji1 +躹 2722 ju2 +躺 2922 tang3 1854 +躻 2321 kong1 +躼 2123 lao4 +躽 2121 yan3 +躾 2828 mei3 +躿 2029 kang1 +軀躯 2121 qu1 +軁 2524 lou2 +軂 2922 lao4 +軃 2625 tuo3duo3 +軄 2325 zhi2 +軅 2121 yan4 +軆 2521 ti3 +軇 2524 dao4 +軈 2023 ying1 +軉 2328 yu4 +車车 5000 che1ju1 u +軋轧 5201 ya4ga2zha2 +軌轨 5401 gui3 +軍军 3750 jun1 +軎 5060 wei4 +軏 5101 yue4 +軐 5701 xin4xian4 +軑轪 5408 di4dai4 +軒轩 5104 xuan1 +軓 5701 fan4 +軔轫 5702 ren4 +軕 5207 shan1 +軖 5101 qiang2 +軗 5704 shu1 +軘 5501 tun2 +軙 5104 chen2qi2 +軚 5403 dai4 +軛轭 5101 e4 +軜 5402 na4 +軝 5204 qi2 +軞 5201 mao2 +軟软 5708 ruan3 +軠 5201 ren4 +軡 5802 fan3 +転 5103 zhuan3 +軣 5080 hong1 +軤轷 5204 hu1 +軥 5702 qu2gou1ju1 +軦 5601 huang4 +軧 5204 di3 +軨 5803 ling2 +軩 5306 dai4 +軪 5402 ao1 +軫轸 5802 zhen3 +軬 2350 fan4ben4 +軭 5101 kuang1 +軮 5508 ang3yang3 +軯 5104 peng1 +軰 1250 bei4 +軱 5203 gu1 +軲轱 5406 gu1 +軳 5701 pao2 +軴 5001 zhu4 +軵 5400 rong3fu3 +軶 5101 e4 +軷 5304 ba2 +軸轴 5506 zhou2zhu2 +軹轵 5608 zhi3 +軺轺 5706 yao2diao1 +軻轲 5102 ke1 +軼轶 5508 yi4die2zhe2 +軽 5701 qing1 +軾轼 5304 shi4 +軿 5804 ping2peng1 +輀 5102 er2 +輁 5408 qiong2gong3 +輂 4450 ju2 +較较 5004 jiao4jue2xiao4 +輄 5901 guang1 +輅辂 5706 lu4ya4he2 +輆 5008 kai3 +輇辁 5801 quan2chun1 +輈辀 5704 zhou1 +載载 4355 zai4zai +輊轾 5101 zhi4 +輋 2250 she1 +輌 5102 liang4 +輍 5806 yu4 +輎 5902 shao1 +輏 5106 you2 +輐 5301 huan3wan4 +輑 5706 yun3 +輒辄 5101 zhe2 +輓挽 5701 wan3 +輔辅 5302 fu3 +輕轻 5101 qing1qing4 +輖 5702 zhou1 +輗 5701 ni2 +輘 5404 ling2leng2 +輙 5104 zhe2 +輚 5305 zhan4 +輛辆 5102 liang4 +輜辎 5206 zi1zi4 +輝辉 9725 hui1 +輞辋 5702 wang3 +輟辍 5704 chuo4 +輠 5609 guo3guo1hua4hui4 +輡 5707 kan3 +輢 5402 yi3 +輣 5702 peng2 +輤 5502 qian4 +輥辊 5601 gun3 +輦辇 5550 nian3 +輧 5804 pian2ping2 +輨 5307 guan3 +輩辈 1150 bei4 +輪轮 5802 lun2 +輫 5101 pai2pei2 +輬辌 5009 liang2 +輭 5108 ruan3 +輮 5709 rou2rou3 +輯辑 5604 ji2 +輰 5602 yang2 +輱 5305 xian2 +輲 5202 chuan2 +輳辏 5508 cou4 +輴 5206 chun1shun1qun1 +輵 5602 ge2 +輶 5806 you2 +輷 5702 hong1 +輸输 5802 shu1shu4 +輹 5804 fu4 +輺 5206 zi1zi4 +輻辐 5106 fu2 +輼 5601 wen1 +輽 5306 ben4 +輾辗 5703 zhan3nian3 +輿舆 7780 yu2yu4 +轀辒 5601 wen1 +轁 5207 tao1kan3 +轂毂 4754 gu3gu1 +轃 5509 zhen1 +轄辖 5306 xia2he2 +轅辕 5403 yuan2 +轆辘 5001 lu4 +轇 5702 jiu1jiao1 +轈 5209 chao2 +轉转 5504 zhuan3zhuan4 +轊 5507 wei4 +轋 5503 hun2 +轌 5107 xue3 +轍辙 5804 che4zhe2 +轎轿 5202 jiao4 +轏 5704 zhan4 +轐 5208 pu2bu2 +轑 5409 lao3lao2liao3 +轒 5408 fen2 +轓 5206 fan1 +轔辚 5905 lin2lin4 +轕 5402 ge2 +轖 5406 se4 +轗 5303 kan3 +轘 5603 huan4huan2 +轙 5805 yi3 +轚 5750 ji2 +轛 5400 dui4 +轜 5102 er2 +轝 7750 yu2 +轞 5801 xian4 +轟轰 5055 hong1 +轠 5606 lei3lei2 +轡辔 2260 pei4 +轢轹 5209 li4 +轣 5101 li4 +轤轳 5101 lu2 +轥 5402 lin4 +车車 4050 che1ju1 283 +轧軋 4251 ya4ga2zha2 3055 +轨軌 4451 gui3 2075 +轩軒 4154 xuan1 2227 +轪軑 4458 di4dai4 +轫軔 4752 ren4 +转轉 4553 zhuan3zhuan4 271 +轭軛 4151 e4 +轮輪 4851 lun2 wheel 997 +软軟 4758 ruan3 816 +轰轟 4044 hong1 1845 +轱軲 4456 gu1 +轲軻 4152 ke1 +轳轤 4150 lu2 +轴軸 4556 zhou2zhu2 axis 2662 +轵軹 4658 zhi3 +轶軼 4558 yi4die2 +轷軤 4254 hu1 +轸軫 4852 zhen3 +轹轢 4259 li4 +轺軺 4756 yao2 +轻輕 4751 qing1 light 363 +轼軾 4354 shi4 +载載 4355 zai4 1081 +轾輊 4151 zhi4 +轿轎 4252 jiao4 1847 +辀輈 4754 zhou1 +辁輇 4851 quan2 +辂輅 4756 lu4ya4 +较較 4054 jiao4 571 +辄輒 4151 zhe2 3278 +辅輔 4352 fu3 2033 +辆輛 4152 liang4 1335 +辇輦 5550 nian3 +辈輩 1150 bei4 1143 +辉輝 9725 hui1 1423 +辊輥 4651 gun3 +辋輞 4752 wang3 +辌輬 7059 liang2 +辍輟 4754 chuo4 3704 +辎輜 4256 zi1 +辏輳 4558 cou4 +辐輻 4156 fu2 3097 +辑輯 4654 ji2 1776 +辒轀 4651 wen1 +输輸 4852 shu1 lose 1035 +辔轡 2260 pei4 +辕轅 4453 yuan2 3162 +辖轄 4356 xia2 2529 +辗輾 4753 zhan3nian3 3380 +辘轆 4051 lu4 3985 +辙轍 4854 che4zhe2 2967 +辚轔 4955 lin2lin4 +辛 0040 xin1 u 1268 +辜 4040 gu1 2352 +辝 2064 ci2 +辞辭 2064 ci2 1156 +辟 7064 pi4pi1bi4 2048 +辠 2640 zui4 +辡 0044 bian4 +辢 5094 la4 +辣 0549 la4 2350 +辤 2044 ci2 +辥 2074 xue1 +辦办 0044 ban4 +辧 0044 bian4 +辨 0044 bian4 1724 +辩辯 0044 bian4 1617 +辪 2074 xue1 +辫辮 0044 bian4 3002 +辬 0044 ban1 +辭辞 2024 ci2 +辮辫 0044 bian4 +辯辩 0044 bian4 +辰 7123 chen2 u 1877 +辱 7134 ru3ru4 1874 +農农 5523 nong2 +辳 4423 nong2 +辴 6153 zhen3 +辵 2080 chuo4 u +辶 3030 chuo4 +辷 3130 yi1 +辸 3730 reng2 +边邊 3430 bian1 side 241 +辺 3730 bian1 +辻 3430 shi4 +込 3830 yu1 +辽遼 3730 liao2 2034 +达達 3430 da2 382 +辿 3230 chan1 +迀 3230 gan1 +迁遷 3230 qian1gan1 1536 +迂 3130 yu1yu4 3332 +迃 3130 yu1 +迄 3830 qi4 2903 +迅 3730 xun4 1228 +迆 3430 yi3yi2 +过過 3430 guo4guo1 33 +迈邁 3130 mai4 1671 +迉 3730 qi2 +迊 3130 za1 +迋 3130 wang4kuang1 +迌 3730 tu4 +迍 3530 zhun1tun2 +迎 3730 ying2 805 +迏 3430 ti4 +运運 3130 yun4 416 +近 3230 jin4ji4 293 +迒 3030 hang2 +迓 3130 ya4 +返 3230 fan3 1366 +迕 3830 wu4wu3 +迖 3330 da2ti4ta4 +迗 3230 e2 +还還 3130 huan2hai2 yet 73 +这這 3030 zhe4 the 10 +迚 3530 da2 +进進 3530 jin4 63 +远遠 3130 yuan3 317 +违違 3530 wei2 1376 +连連 3430 lian2 246 +迟遲 3730 chi2 late 1056 +迠 3130 che4 +迡 3730 ni4 +迢 3730 tiao2 3247 +迣 3430 zhi4chi4li4 +迤 3830 yi3tuo1yi2tuo2 +迥 3730 jiong3 3456 +迦 3630 jia1xie4 3252 +迧 3530 chen2zhen4 +迨 3330 dai4 +迩邇 3730 er3 3956 +迪 3530 di2 1820 +迫 3630 po4pai3 1176 +迬 3030 wang3 +迭 3530 die2 2374 +迮 3830 ze2zuo4 +迯 3330 tao2 +述 3330 shu4 1012 +迱 3330 tuo2 +迲 3430 keop +迳逕 3730 jing4 +迴 3630 hui2 +迵 3730 tong2 +迶 3430 you4 +迷 3930 mi2 969 +迸 3830 beng4bing3peng1 3054 +迹跡 3030 ji1ji4 footprint trace 1031 +迺 3130 nai3 +迻 3730 yi2 +迼 3430 jie2 +追 3730 zhui1dui1 699 +迾 3230 lie4 +迿 3730 xun4 +退 3730 tui4 back 651 +送 3830 song4 373 +适適 3230 shi4 655 +逃 3230 tao2 1083 +逄 3730 pang2feng2 +逅 3230 hou4gou4 +逆 3830 ni4 1852 +逇 3430 dun4 +逈 3730 jiong3 +选選 3430 xuan3 560 +逊遜 3930 xun4 2204 +逋 3330 bu1 +逌 3130 you2 +逍 3930 xiao1 3160 +逎 3130 qiu2 +透 3230 tou4shu1 1018 +逐 3130 zhu2 992 +逑 3330 qiu2 +递遞 3830 di4 1238 +逓 3230 di4 +途 3830 tu2 1088 +逕迳 3130 jing4 +逖 3930 ti4 +逗 3130 dou4 2414 +逘 3330 yi3 +這这 3030 zhe4zhei4 +通 3730 tong1 163 +逛 3230 guang4 2602 +逜 3130 wu4 +逝 3230 shi4 1971 +逞 3630 cheng3ying2 3007 +速 3530 su4 654 +造 3430 zao4 449 +逡 3330 qun1 +逢 3730 feng2 1744 +連连 3530 lian2 +逤 3930 suo4 +逥 3630 hui2 +逦邐 3130 li3 +逧 3830 gu3 +逨 3430 lai2 +逩 3430 ben4 +逪 3430 cuo4 +逫 3730 jue2 +逬 3830 beng4 +逭 3330 huan4 +逮 3530 dai4 2604 +逯 3730 lu4dai4 +逰 3830 you2 +週 3730 zhou1 +進进 3030 jin4 +逳 3030 yu4 +逴 3130 chuo4 +逵 3430 kui2 3984 +逶 3230 wei1 +逷 3630 ti4 +逸 3730 yi4 1805 +逹 3430 da2 +逺 3430 yuan3 +逻邏 3630 luo2 2185 +逼 3130 bi1 force 1383 +逽 3430 nuo4 +逾 3830 yu2dou4 2576 +逿 3630 dang4tang2 +遀 3430 sui2 +遁 3230 dun4 3191 +遂 3830 sui4sui2 then 1917 +遃 3030 yan3 +遄 3230 chuan2 +遅 3730 chi2 +遆 3030 ti2 +遇 3630 yu4 669 +遈 3680 shi2 +遉 3130 zhen1zheng1 +遊 3830 you2 +運运 3730 yun4 +遌 3630 e4 +遍 3330 bian4 960 +過过 3730 guo4guo5guo1huo4 +遏 3630 e4 2838 +遐 3730 xia2 3212 +遑 3630 huang2 +遒 3830 qiu2qiu1 +道 3830 dao4 60 +達达 3430 da2 +違违 3430 wei2hui2 +遖 3430 nan2 +遗遺 3530 yi2 1010 +遘 3530 gou4 +遙遥 3730 yao2 +遚 3730 chu4 +遛 3730 liu2liu4 +遜逊 3230 xun4 +遝 3630 ta4dai4 +遞递 3230 di4 +遟 3730 chi2zhi4xi1 +遠远 3430 yuan3yuan4 +遡 3730 su4 +遢 3630 ta4 +遣 3530 qian3qian4 2008 +遤 3130 ma3 +遥遙 3230 yao2 1549 +遦 3730 guan4 +遧 3030 zhang1 +遨 3830 ao2 +適适 3030 shi4 +遪 3330 ce4 +遫 3830 chi4 +遬 3730 su4 +遭 3530 zao1 1245 +遮 3030 zhe1 1966 +遯 3130 dun4 +遰 3430 di4shi4 +遱 3530 lou2 +遲迟 3730 chi2 +遳 3430 cuo1 +遴 3930 lin2lin4 +遵 3830 zun1 1735 +遶 3430 rao4rao3 +遷迁 3130 qian1 +選选 3730 xuan3 +遹 3730 yu4 +遺遗 3530 yi2 +遻 3630 wu4e4 +遼辽 3430 liao2 +遽 3130 ju4qu2 3810 +遾 3830 shi4 +避 3030 bi4 947 +邀 3830 yao1 1572 +邁迈 3430 mai4 +邂 3730 xie4 +邃 3330 sui4 3638 +還还 3630 huan2hai2 +邅 3030 zhan1 +邆 3230 teng2 +邇迩 3130 er3 +邈 3630 miao3 +邉 3630 bian1 +邊边 3630 bian1 +邋 3230 la1 +邌 3730 li2 +邍 3730 yuan2 +邎 3230 yao2 +邏逻 3630 luo2 +邐逦 3130 li3 +邑 6071 yi4e4 u 2901 +邒 1722 ting2 +邓鄧 7742 deng4 1558 +邔 1772 qi3ji4 +邕 2271 yong1yong3 +邖 2772 shan1 +邗 1742 han2 +邘 1742 yu2 +邙 0772 mang2 +邚 4742 ru2 +邛 1712 qiong2 +邜 2722 xi1 +邝鄺 7621 kuang4 +邞 5782 fu1 +邟 0722 kang4kang2 +邠 8722 bin1 +邡 0722 fang1fang3fang4 +邢 1742 xing2geng3 2770 +那 1752 na4nei4 118 +邤 2722 xin1 +邥 4702 shen3 +邦 5702 bang1 1443 +邧 1722 yuan2 +邨 5772 cun1 +邩 9782 huo3 +邪 1722 xie2ya2 1601 +邫 5601 bang1 +邬鄔 2712 wu1 3723 +邭 2762 ju4 +邮郵 5762 you2 1850 +邯 4772 han2han4 3781 +邰 2762 tai2 +邱 7712 qiu1 2418 +邲 3702 bi4 +邳 1712 pei2pi1 +邴 1722 bing3 +邵 1762 shao4 2353 +邶 1712 bei4 +邷 1772 wa3 +邸 7772 di3 3335 +邹鄒 2712 zou1 2562 +邺鄴 3712 ye4 +邻鄰 8732 lin2 1392 +邼 7772 kuang1 +邽 4712 gui1 +邾 2792 zhu1 +邿 4732 shi1 +郀 4722 ku1 +郁鬱 4722 yu4 1881 +郂 0722 gai1 +郃 8762 he2xia2ge2 +郄 4772 xi4que4 +郅 1712 zhi4zhi1ji2 +郆 4762 ji2 +郇 2762 xun2huan2 +郈 7722 hou4 +郉 1742 xing2 +郊 0742 jiao1 2050 +郋 2762 xi2xi1 +郌 4611 gui1 +郍 2742 nuo2 +郎 3772 lang2lang4 1242 +郏郟 5782 jia2 +郐鄶 8772 kuai4 +郑鄭 8782 zheng4 1321 +郒 3671 lang2 +郓鄆 3752 yun4 +郔 1742 yan2 +郕 7722 cheng2 +郖 1712 dou1dou4 +郗 4722 chi1xi1 +郘 6762 lv3 +郙 5722 fu3 +郚 1762 wu2 +郛 2742 fu2 +郜 2762 gao4 +郝 4732 hao3shi4 2510 +郞 3772 lang2 +郟郏 4702 jia2 +郠 1752 geng3 +郡 1762 jun4 2584 +郢 6712 ying3cheng2 +郣 4742 bo2 +郤 8762 xi4 +郥 6782 bei4 +郦酈 1722 li4zhi2 +郧鄖 6782 yun2 +部 0762 bu4pou3 170 +郩 4742 xiao2 +郪 5742 qi1ci1 +郫 2742 pi2 +郬 5722 qing1 +郭 0742 guo1guo2 1515 +郮 7722 zhou1 +郯 9782 tan2 +郰 1712 zou1 +郱 8742 ping2 +郲 4792 lai2 +郳 7722 ni2 +郴 4792 chen1lan2 +郵邮 2712 you2 +郶 0661 bu4 +郷 2722 xiang1 +郸鄲 8752 dan1 +郹 6782 ju2 +郺 2221 yong1 +郻 6722 qiao1 +郼 4752 yi1 +都 4762 du1dou1 all 69 +郾 7772 yan3yan1 +郿 7722 mei2fei2 +鄀 4762 ruo4 +鄁 1722 bei4 +鄂 6722 e4 3320 +鄃 8722 yu2shu1 +鄄 1712 juan4 +鄅 2722 yu3 +鄆郓 7752 yun4 +鄇 2722 hou4 +鄈 1782 kui2 +鄉乡 2722 xiang1 +鄊 2722 xiang1 +鄋 7742 sou1 +鄌 0722 tang2 +鄍 7782 ming2 +鄎 2732 xi4 +鄏 7732 ru4ru3 +鄐 0762 chu4 +鄑 1762 zi1 +鄒邹 2742 zou1ju4 +鄓 2782 ju2 +鄔邬 2732 wu1 +鄕 2722 xiang1 +鄖郧 6782 yun2 +鄗 0722 hao4 +鄘 0722 yong1yong2 +鄙 6762 bi3 2641 +鄚 4782 mo4 +鄛 2792 chao2 +鄜 0222 fu1 +鄝 1722 liao3 +鄞 4712 yin2 +鄟 5732 zhuan1 +鄠 1722 hu4 +鄡 7792 qiao1 +鄢 1732 yan1 +鄣 0742 zhang1zhang4 +鄤 6742 man4wan4fan4 +鄥 2732 qiao1 +鄦 8732 xu3 +鄧邓 1712 deng4 +鄨 9771 bi4 +鄩 2732 xin2xun2 +鄪 5722 bi4 +鄫 8762 ceng2zeng1 +鄬 2732 wei2 +鄭郑 8782 zheng4 +鄮 7782 mao4 +鄯 8762 shan4 +鄰邻 9722 lin2lin4 +鄱 2762 po2pi2pan2 +鄲郸 6752 dan1duo1 +鄳 7772 meng2 +鄴邺 3792 ye4 +鄵 6792 cao1cao4 +鄶郐 8762 kuai4 +鄷 5712 feng1 +鄸 4722 meng2 +鄹 1722 zou1ju4 +鄺邝 0722 kuang4kuo4 +鄻 5752 lian3lian2 +鄼 5782 zan4cuo2 +鄽 0722 chan2 +鄾 1242 you1 +鄿 4752 qi2 +酀 4732 yan1 +酁 2722 chan2 +酂酇 2782 zan4da2 +酃 1762 ling2 +酄 4722 huan1 +酅 2722 xi1 +酆 5712 feng1 +酇酂 2782 zan4da2 +酈郦 1722 li4zhi2li2 +酉 1060 you3 u 3226 +酊 1162 ding3ding1 +酋 8060 qiu2 3395 +酌 1762 zhuo2 2946 +配 1761 pei4 784 +酎 1460 zhou4 +酏 1461 yi2hu4tuo2yi3 +酐 1164 hang4gan1hang3han2 +酑 1164 yu3 +酒 3116 jiu3 alcohol 614 +酓 8060 yan3 +酔 1464 zui4 +酕 1261 mao2 +酖 1461 dan1zhen4 +酗 1267 xu4 +酘 1764 tou2 +酙 1460 zhen1 +酚 1862 fen1 +酛 1161 yuan2 +酜 1568 fu1 +酝醖 1163 yun4 3438 +酞 1463 tai4 +酟 1166 tian1 +酠 1762 qia3 +酡 1361 tuo2 +酢 1861 zuo4cu4 +酣 1467 han1han4 3211 +酤 1466 gu1 +酥 1269 su1 3216 +酦醱 1364 po4po1 +酧 1364 chou2 +酨 4365 zai4zui4 +酩 1766 ming2ming3 +酪 1766 lao4luo4lu4 +酫 1861 chuo4 +酬 1260 chou2 2148 +酭 1462 you4 +酮 1762 tong2 +酯 1268 zhi3 +酰 1461 xian1 +酱醬 3760 jiang4 2814 +酲 1661 cheng2 +酳 1262 yin4 +酴 1869 tu2 +酵 1464 jiao4xiao4 +酶 1865 mei2 +酷 1466 ku4 cool 2006 +酸 1364 suan1 sour 1750 +酹 1264 lei4 +酺 1362 pu2 +酻 1264 zui4 +酼 1061 hai3 +酽釅 1160 yan4 +酾釃 1162 shi1 +酿釀 1363 niang4 ferment brew 2733 +醀 1061 wei2 +醁 1769 lu4 +醂 1469 lan3 +醃 1461 yan1 +醄 1762 tao2 +醅 1066 pei1 +醆 1365 zhan3 +醇 1064 chun2 3243 +醈 1968 tan2dan4 +醉 1064 zui4 1446 +醊 1764 chuo4zhui1 +醋 1466 cu4 2896 +醌 1661 kun1 +醍 1668 ti2ti3 +醎 1365 mian2 +醏 1466 du1 +醐 1762 hu2 +醑 1762 xu3 +醒 1661 xing3 wake 920 +醓 1461 tan3 +醔 2960 jiu1 +醕 1066 chun2 +醖酝 1661 yun4 +醗 1264 po4 +醘 1401 ke4 +醙 1764 sou1 +醚 1963 mi2 +醛 1461 quan2chuo4 +醜丑 1661 chou3 +醝 1861 cuo2cuo1 +醞酝 1661 yun4 +醟 9960 yong4yong3 +醠 1561 ang4 +醡 1361 zha4 +醢 1461 hai3 +醣 1066 tang2 +醤 2760 jiang4 +醥 1169 piao3 +醦 1362 shan3 +醧 1161 yu4 +醨 1062 li2 +醩 1566 zao2zao1 +醪 1762 lao2 +醫医 7760 yi1 +醬酱 2760 jiang4 +醭 1268 bu2pu1pu2 +醮 1063 jiao4qiao2zhan4 +醯 1061 xi1 +醰 1164 tan2 +醱酦 1264 po4po1 +醲 1563 nong2 +醳 1664 yi4shi4 +醴 1561 li3 +醵 1163 ju4 +醶 1868 yan4 +醷 1063 yi4 +醸 1063 niang4 +醹 1162 ru2 +醺 1263 xun1 +醻 1064 chou2 +醼 1463 yan4 +醽 1166 ling2 +醾 1069 mi2 +醿 1069 mi2 +釀酿 1063 niang4niang2 +釁衅 7722 xin4 +釂 1264 jiao4 +釃酾 1161 shi1 +釄 1061 mi2 +釅酽 1664 yan4 +釆 2090 bian4cai3 u +采埰 2090 cai3cai4 597 +釈 2798 shi4 +釉 2596 you4 +释釋 2795 shi4yi4 959 +釋释 2694 shi4yi4 +里 6010 li3 in 83 +重 2010 zhong4 heavy 116 +野 6712 ye3 919 +量 6010 liang4liang2 quantity 298 +釐厘 5821 li2xi1 +金 8010 jin1 u gold 199 +釒钅 8010 jin1 +釓钆 8211 ga2qiu2 +釔钇 8711 yi3 +釕钌 8712 liao3liao4diao3 +釖 8712 dao1 +釗钊 8712 zhao1 +釘钉 8112 ding1ding4ling2 +釙钋 8310 po4po1 +釚 8411 qiu2 +釛 8412 he2 +釜 8010 fu3 +針针 8410 zhen1 +釞 8810 zhi2 +釟 8810 ba1 +釠 8711 luan4 +釡 8010 fu3 +釢 8712 nai2 +釣钓 8712 diao4 +釤钐 8212 shan1shan4 +釥 8910 qiao3 +釦 8610 kou4 +釧钏 8210 chuan4 +釨 8714 zi3 +釩钒 8711 fan2fan3fan4 vanadium +釪 8114 yu2 +釫 8112 hua2 +釬 8114 han4gan1 +釭 8111 gang1gong1 +釮 8410 qi2 +釯 8011 mang2 +釰 8712 ri4 +釱 8418 di4dai4 +釲 8711 si4 +釳 8811 xi4 +釴 8314 yi4 +釵钗 8714 chai1cha1 +釶 8411 shi1she2 +釷钍 8411 tu3 +釸 8712 xi4 +釹钕 8414 nv3 +釺钎 8214 qian1 +釻 8511 qiu2 +釼 8715 jian4ren4 +釽 8211 pi1pi4 +釾䥺 8114 ye2 +釿 8212 yin2jin1 +鈀钯 8711 ba3pa2ba1 +鈁钫 8012 fang1 +鈂 8411 chen2 +鈃钘 8114 xing2jian1 +鈄钭 8410 dou3 +鈅 8712 yue4 +鈆 8813 yan2qian1 +鈇 8518 fu1fu3 +鈈钚 8119 pi1bu4 +鈉钠 8412 na4rui4 +鈊 8310 xin1 +鈋 8411 e2 +鈌 8518 jue2 +鈍钝 8511 dun4 +鈎钩 8712 gou1 +鈏 8210 yin3 +鈐钤 8812 qian2han2 +鈑钣 8214 ban3 +鈒钑 8714 ji2sa4 +鈓 8211 ren2 +鈔钞 8912 chao1 +鈕钮 8711 niu3chou3 +鈖 8810 fen1 +鈗 8311 yun3 +鈘 8414 ji3 +鈙 8114 qin2 +鈚 8211 pi2pi1 +鈛 8315 guo1 +鈜 8413 hong2 +鈝 8510 yin2 +鈞钧 8712 jun1 +鈟 8712 shi1 +鈠 8714 yi4 +鈡 8510 zhong1 +鈢 8419 nie1 +鈣钙 8112 gai4 +鈤 8610 ri4 +鈥钬 8918 huo3huo2 +鈦钛 8413 tai4 titanium +鈧钪 8011 kang4 +鈨 8111 yuan2 +鈩 8310 lu2 +鈪 8111 e4 +鈫 8014 qin2 +鈬 8718 duo2 +鈭 2210 zi1 +鈮铌 8711 ni2ni3 +鈯 8217 tu2 +鈰铈 8012 shi4 +鈱 8714 min2 +鈲 8213 gu1 +鈳钶 8112 ke1e1 +鈴铃 8813 ling2 +鈵 8112 bing4 +鈶 8316 yi2 +鈷钴 8416 gu3 +鈸钹 8314 bo2ba2 +鈹铍 8414 pi1pi2 +鈺钰 8111 yu4 +鈻 8717 si4 +鈼 8811 zuo2 +鈽钸 8412 bu4bu1 +鈾铀 8516 you2zhou4 +鈿钿 8610 dian4tian2 +鉀钾 8615 jia3 +鉁 8812 zhen1 +鉂 6510 shi3 +鉃 8818 shi4 +鉄 8518 tie3 +鉅钜 8111 ju4 +鉆 8116 zhan1 +鉇 8811 shi1yi2she2 +鉈铊 8311 ta1tuo2 +鉉铉 8013 xuan4 +鉊 8716 zhao1 +鉋铇 8711 bao4pao2 +鉌 8219 he2 +鉍铋 8310 bi4se4 +鉎 8511 sheng1 +鉏 8711 chu2ju3xu2 +鉐 8116 shi2 +鉑铂 8610 bo2 +鉒 8011 zhu4 +鉓 8812 chi4 +鉔 8111 za1 +鉕钷 8111 po1po3 +鉖 8713 tong2 +鉗钳 8417 qian2an1 +鉘 8512 fu2 +鉙 8618 zhai3 +鉚铆 8712 liu3mao3 +鉛铅 8816 qian1yan2 +鉜 8410 fu2 +鉝 8011 li4 +鉞钺 8315 yue4hui4 +鉟 8111 pi1 +鉠 8518 yang1 +鉡 8915 ban4 +鉢钵 8513 bo1 +鉣 8413 jie2 +鉤钩 8712 gou1 +鉥 8319 shu4 +鉦钲 8111 zheng1 +鉧 8715 mu3 +鉨 8719 ni3nie3xi3 +鉩 8819 nie1xi3 +鉪 8411 di4 +鉫 8610 jia1 +鉬钼 8711 mu4 +鉭钽 8611 dan4tan3 +鉮 8510 shen1shen2 +鉯 8810 yi3 +鉰 8712 si1 +鉱 8013 kuang4 +鉲 8113 ka3 californium +鉳 8211 bei3 +鉴鑒 2810 jian4 1626 +鉵 8513 tong2 +鉶铏 8210 xing2 +鉷 8418 hong2 +鉸铰 8014 jiao3 +鉹 8712 chi3 +鉺铒 8114 er3er4keng1 +鉻铬 8716 ge4ge2luo4ge1 +鉼 8814 bing3 +鉽 8314 shi4 +鉾 8315 mou2 +鉿铪 8816 ha1ke1 +銀银 8713 yin2 +銁 8712 jun1 +銂 8210 zhou1 +銃铳 8011 chong4 +銄 8712 shang4 +銅铜 8712 tong2 +銆 8116 mo4 +銇 8519 lei4 +銈 8411 ji1 +銉 8510 yu4 +銊 8315 xu4 +銋 8211 ren2 +銌 8414 zun4 +銍铚 8111 zhi4 +銎 1710 qiong1qiong2 +銏 8714 shan4 +銐 1210 chi4 +銑铣 8411 xian3xi3xian1 +銒 8114 xing2jian1 +銓铨 8811 quan2 +銔 8114 pi1 +銕 8518 tie3yi2 +銖铢 8519 zhu1 +銗 8216 hou2hou4xiang4 +銘铭 8716 ming2 +銙 8412 kua3 +銚铫 8211 diao4tiao2yao2 +銛铦 8216 xian1 +銜衔 2110 xian2 +銝 8419 xiu1 +銞 2710 jun1 +銟 8212 cha1 +銠铑 8411 lao3 +銡 8416 ji2 +銢 8319 pi3 +銣铷 8610 ru2ru3 +銤 8919 mi3 +銥铱 8013 yi1yi3 +銦铟 8610 yin1 +銧 8911 guang1 +銨铵 8314 an3an1 +銩铥 8113 diu1 +銪铕 8412 you3 +銫铯 8711 se4 +銬铐 8412 kao4 +銭 8315 qian2 +銮鑾 0010 luan2 +銯 8219 si1 +銰 8414 ai1 +銱铞 8612 diao4 +銲 8614 han4 +銳锐 8811 rui4dui4yue4 +銴 5210 shi4 +銵 8714 keng1 +銶 8319 qiu2 +銷销 8912 xiao1 +銸 8111 zhe2 +銹锈 8212 xiu4 +銺 2410 zang4 +銻锑 8812 ti1ti2ti4 +銼锉 8811 cuo4 +銽 8216 gua1 +銾 8119 gong3 +銿 8712 zhong1yong1 +鋀 8111 dou4 +鋁铝 8616 lv3lv4 aluminium +鋂 8815 mei2 +鋃锒 8313 lang2 +鋄 8114 wan3wan4 +鋅锌 8014 xin1zi3 +鋆 4710 yun2 +鋇钡 8618 bei4 +鋈 3210 wu4 +鋉 8519 su4 +鋊 8816 yu4 +鋋 8214 chan2yan2 +鋌铤 8214 ting3ding4 +鋍 8414 bo2 +鋎 8311 han4 +鋏铗 8418 jia2 +鋐 8313 hong2 +鋑 8314 cuan1 +鋒锋 8715 feng1 +鋓 8210 chan1 +鋔 8711 wan3 +鋕 8413 zhi4 +鋖 8214 si1 +鋗 8612 xuan1juan1 +鋘 8618 wu2hua2 +鋙铻 8116 wu2yu3 +鋚 2810 tiao2 +鋛 8510 gong3 +鋜 8618 zhuo2 +鋝锊 8214 lue4 +鋞 8111 xing2 +鋟锓 8714 qin3 +鋠 8113 shen4 +鋡 8816 han2 +鋢 8214 lue4 +鋣铘 8712 xie2ye2 +鋤锄 8412 chu2ju3 +鋥锃 8611 zheng4zeng4 +鋦锔 8712 ju1ju2 +鋧 8611 xian4 +鋨锇 8315 tie3e2 +鋩铓 8411 mang2 +鋪铺 8312 pu1pu4 +鋫 2210 li2 +鋬 5210 pan4 +鋭锐 8811 rui4dui4 +鋮铖 8315 cheng2 +鋯锆 8416 gao4 +鋰锂 8611 li3 +鋱铽 8314 te4 +鋲 8218 bing1 +鋳 8514 zhu4 +鋴 8411 zhen4 +鋵 8211 tu1 +鋶锍 8011 liu3 +鋷 8714 zui4 +鋸锯 8716 ju4ju1 +鋹 8113 chang3 +鋺 8311 yuan1 +鋻 7710 jian4 +鋼钢 8712 gang1gang4 +鋽 8114 diao4 +鋾 8712 tao2 +鋿 8912 chang2 +錀 8812 lun2 roentgenium +錁锞 8619 guo3kua3ke4 +錂 8414 ling2 +錃 3410 bei1 +錄录 8719 lu4 +錅 2710 li2 +錆锖 8512 qiang1 +錇锫 8016 pou2pei2fu2 +錈锩 8911 juan4 +錉 8216 min2 +錊 8014 zui4 +錋 8712 peng2beng4 +錌 8214 an4 +錍 8614 pi2pi1 +錎 8717 xian4 +錏铔 8111 ya4 +錐锥 8011 zhui1 +錑 8318 lei4 +錒锕 8112 a1 +錓 8811 kong1 +錔 8216 ta4 +錕锟 8611 kun1gun3 +錖 2710 du3 +錗 8214 wei4 +錘锤 8211 chui2 +錙锱 8216 zi1 +錚铮 8715 zheng1 +錛锛 8414 ben1 +錜 8813 nie1nie4 +錝 8319 cong2 +錞 8014 chun2 +錟锬 8918 tan2 +錠锭 8318 ding4 +錡锜 8412 qi2yi3 +錢钱 8315 qian2jian3 +錣 8714 zhuo2zhui4 +錤 8418 qi2ji1 +錥 8012 yu4 +錦锦 8612 jin3 +錧 8317 guan3 +錨锚 8416 mao2 +錩锠 8616 chang1 +錪 8518 tian3 +錫锡 8612 xi2xi1ti4 +錬 8519 lian4 +錭 8712 tao2diao1 +錮锢 8610 gu4 +錯错 8416 cuo4cu4xi1 +錰 8413 shu4 +錱 8011 zhen1 +録录 8719 lu4lv4 +錳锰 8711 meng3 +錴 8411 lu4 +錵 8411 hua1 +錶 8513 biao3 +錷 8211 ga2 +錸铼 8419 lai2 +錹 8112 ken3 +錺 8412 fang1 +錻 8314 bu1 +錼 8019 nai4 neptunium +錽 8114 wan4 +錾鏨 4210 zan4 +錿 8111 hu3 +鍀锝 8614 de2 +鍁锨 8718 xian1 +鍂 8811 pian1 +鍃锪 8713 huo1huo4 +鍄 8019 liang4 +鍅 8413 fa3 +鍆钔 8712 men2 +鍇锴 8216 kai3 +鍈锳 8418 ying1 +鍉 8618 chi2 +鍊 8519 lian4 +鍋锅 8712 guo1guo3 +鍌 3410 xian3 +鍍镀 8014 du4 +鍎 8216 tu2 +鍏 8415 wei2 +鍐 8214 cong1 +鍑 8814 fu4 +鍒 8719 rou2 +鍓 8614 ji2 +鍔锷 8612 e4 +鍕 8715 rou2 +鍖 8411 chen3zhen1 +鍗 8012 ti2 +鍘铡 8210 zha2 +鍙 3410 hong4 +鍚钖 8612 yang2 +鍛锻 8714 duan4 +鍜 8714 xia1xia2 +鍝 8612 yu2 +鍞 8118 keng1 +鍟 8611 xing1 +鍠锽 8611 huang2 +鍡 8613 wei3 +鍢 8116 fu4 +鍣 8416 zhao1 +鍤锸 8217 cha2 +鍥锲 8718 qie4 +鍦 8811 she2shi1 +鍧 8712 hong1 +鍨 8218 kui2 +鍩锘 8416 tian3nuo4 +鍪 1810 mou2 +鍫 2910 qiao1 +鍬锹 8918 qiao1 +鍭 8718 hou2 +鍮 8812 tou1 +鍯 8713 cong1 +鍰锾 8214 huan2 +鍱 8419 ye4 +鍲 8716 min2 +鍳 7810 jian4 +鍴 8212 duan1 +鍵键 8514 jian4 +鍶锶 8613 si1song1 +鍷 8411 kui1 +鍸 8712 hu2 +鍹 8311 xuan1 +鍺锗 8416 zhe3duo3du3 +鍻 8612 jie2 +鍼 8315 zhen1qian2 +鍽 8312 bian1 +鍾钟 8211 zhong1 +鍿 8216 zi1 +鎀 8712 xiu1 +鎁 8712 ye2 +鎂镁 8818 mei3 +鎃 8213 pai4 +鎄锿 8013 ai1 +鎅 8612 jie4 +鎆 8812 qian2 +鎇镅 8716 mei2 +鎈 8811 chuo1 +鎉 8612 ta4 +鎊镑 8012 bang4pang1 +鎋 8316 xia2 +鎌 8813 lian2 +鎍 8419 suo3 +鎎 8811 xi4 +鎏 3010 liu2 +鎐 8217 zu2yao2 +鎑 8411 ye4 +鎒 8114 nou4 +鎓 8812 weng1 +鎔镕 8316 rong2 +鎕 8016 tang2 +鎖锁 8918 suo3 +鎗 8816 qiang1cheng1 +鎘镉 8112 ge2li4 +鎙 8712 shuo4 +鎚锤 8713 chui2 +鎛镈 8314 bo2 +鎜 8710 pan2 +鎝 8416 sa4da1 technetium +鎞 8611 bi4bi1pi1 +鎟 8719 sang3 +鎠 8611 gang1 +鎡镃 8813 zi1 +鎢钨 8712 wu1wu4 +鎣蓥 9910 ying4ying2jiong3 +鎤 8611 huang3 +鎥 2710 tiao2 +鎦镏 8216 liu2liu4 +鎧铠 8211 kai3 +鎨 8014 sun3 +鎩铩 8714 sha1shi4se4 +鎪锼 8714 sou1 +鎫 8714 wan4jian3 +鎬镐 8012 hao4gao3 +鎭 8218 zhen4 +鎮镇 8418 zhen4 +鎯 8712 lang2 +鎰镒 8811 yi4 +鎱 8413 yuan2 +鎲镋 8911 tang3 +鎳镍 8719 nie4 nickel +鎴 8613 xi2 +鎵镓 8313 jia1 +鎶 8112 ge1 copernicium +鎷 8112 ma3 +鎸镌 8012 juan1 +鎹 8813 song4 +鎺 8711 zu3 +鎻 8218 suo3 +鎼 8115 xia4 +鎽 8215 feng1 +鎾 8611 wen1 +鎿镎 8815 na2 +鏀 8116 lu3 +鏁 8219 suo3 +鏂 8111 ou1 +鏃镞 8818 zu2 +鏄 8514 tuan2 +鏅 8712 xiu1 +鏆 8718 guan4 +鏇镟 8818 xuan4 +鏈链 8513 lian4 +鏉 8718 shou4 +鏊 5810 ao2ao4 +鏋 8412 man3 +鏌镆 8418 mo4 +鏍镙 8619 luo2 +鏎 8614 bi4 +鏏 8517 wei4 +鏐镠 8712 liu2 +鏑镝 8012 di2 +鏒 8312 qiao1 +鏓 8713 cong1 +鏔 8318 yi2 +鏕 8011 lu4 +鏖 0021 ao2 +鏗铿 8711 keng1 +鏘锵 8714 qiang1 +鏙 8211 cui1 +鏚 8315 qi4qi1 +鏛 8912 chang2 +鏜镗 8911 tang1 +鏝镘 8614 man4 +鏞镛 8012 yong1 +鏟铲 8011 chan3 +鏠 8713 feng1 +鏡镜 8011 jing4 +鏢镖 8119 biao1 +鏣 8013 shu4 +鏤镂 8514 lou4lv2 +鏥 8316 xiu4 +鏦 8818 cong1 +鏧 4710 long2 +鏨錾 5210 zan4 +鏩 8212 jian4 +鏪 8516 cao2 +鏫 8219 li2 +鏬 8114 xia4 +鏭 8213 xi1 +鏮 8019 kang1 +鏯 8418 shuang3 +鏰镚 8212 beng4 +鏱 8014 zhang1 +鏲 8015 qian1 +鏳 8816 zheng1 +鏴 8716 lu4 +鏵铧 8415 hua2 +鏶 8019 ji2 +鏷镤 8218 pu2 +鏸 8513 hui4 +鏹镪 8313 qiang3 +鏺䥽 8214 po1 +鏻 8915 lin2 +鏼 8819 suo3 +鏽锈 8212 xiu4 +鏾 8814 san3xian4 +鏿 8919 cheng1 +鐀 8518 kui4gui4 +鐁 8212 si1 +鐂 8116 liu2 +鐃铙 8411 nao2 +鐄 8418 heng2 +鐅 9810 pie3 +鐆 7410 sui4 +鐇 8216 fan2 +鐈 8212 qiao2 +鐉 8718 quan1 +鐊 8612 yang2 +鐋铴 8612 tang4 +鐌 8713 xiang4 +鐍 8712 jue2 +鐎 8013 jiao1 +鐏 8814 zun1 +鐐镣 8419 liao4 +鐑 8416 jie2 +鐒铹 8912 lao2 +鐓镦 8814 dui4 +鐔镡 8114 xin2 +鐕 8116 zan1 +鐖 8215 ji1 +鐗 8712 jian3 +鐘钟 8011 zhong1 +鐙镫 8211 deng4 +鐚 8113 ya4 +鐛 8619 ying4 +鐜 0810 dui4 +鐝镢 8118 jue2 +鐞 8714 nou4 +鐟 8516 ti4 +鐠镨 8216 pu3 +鐡 8315 tie3 +鐢 4410 fan2 +鐣 8915 cheng1 +鐤 8212 ding3 +鐥䦅 8816 shan4 +鐦锎 8712 kai1 +鐧锏 8712 jian3jian4jian1 +鐨镄 8518 fei4 +鐩 8813 sui4 +鐪 8112 lu3 +鐫镌 8012 juan1 +鐬 8115 hui4 +鐭 8718 yu4 +鐮镰 8013 lian2 +鐯䦃 8416 zhuo2zhuo1 +鐰 8619 qiao1 +鐱 8818 qian1 +鐲镯 8612 zhuo2shu3 +鐳镭 8116 lei2 +鐴 8014 bi4 +鐵铁 8315 tie3die2 +鐶镮 8613 huan2 +鐷 8419 ye4 +鐸铎 8614 duo2 +鐹 8713 guo3 +鐺铛 8916 dang1cheng1 +鐻 8113 ju4qu2 +鐼 8418 fen2ben1 +鐽 8413 da2 darmstadtium +鐾 7010 bei4bi4 +鐿镱 8013 yi4 +鑀 8214 ai4 +鑁 8214 zong1 +鑂 8213 xun4 +鑃 8711 diao4 +鑄铸 8414 zhu4 +鑅 8919 heng2 +鑆 8410 zhui4 +鑇 8012 ji1 +鑈 8112 nie1 +鑉 8411 ta4 +鑊镬 8414 huo4 +鑋 5110 qing4qing1 +鑌镔 8318 bin1 +鑍 6610 ying1 +鑎 8111 kui4 +鑏 8311 ning2 +鑐 8112 xu1ru2 +鑑 8811 jian4 +鑒鉴 7810 jian4 +鑓 8513 qian3 +鑔镲 8319 cha3 +鑕锧 8218 zhi4 +鑖 8415 mie4mi4 +鑗 8719 li2 +鑘 8616 lei2 +鑙 8316 ji1 +鑚 8518 zuan4zuan1 +鑛 8018 kuang4 +鑜 8918 shang4 +鑝 8411 peng2 +鑞镴 8211 la4 +鑟 8418 du2 +鑠铄 8219 shuo4yue4li4 +鑡 8117 chuo4 +鑢 8113 lv4 +鑣镳 8013 biao1 +鑤 8619 bao4pao2 +鑥镥 8716 lu3 +鑦 8718 xian2 +鑧 8311 kuan1 +鑨 8111 long2 +鑩 8111 e4 +鑪 8111 lu2 rutherfordium +鑫 8011 xin1xun4 3719 +鑬 8811 jian4 +鑭镧 8712 lan2lan4 +鑮 8414 bo2 +鑯 8315 jian1 +鑰钥 8812 yao4yue4 +鑱镵 8711 chan2 +鑲镶 8013 xiang1rang2 +鑳 8318 jian4 +鑴 8212 xi1hui1 +鑵 8411 guan4 +鑶 8415 cang2 +鑷镊 8114 nie4 +鑸 8611 lei3 +鑹镩 8311 cuan4cuan1 +鑺 8611 qu2 +鑻 8415 pan4 +鑼锣 8611 luo2 +鑽钻 8418 zuan1zuan4 +鑾銮 2210 luan2 +鑿凿 3710 zao2 +钀 8318 nie4 +钁镢 8614 jue2 +钂 8913 tang3 +钃 8712 shu3zhu2 +钄 8412 lan2 +钅釒 8070 jin1 +钆釓 8271 qiu2ga2 gadolinium +钇釔 8771 yi3 yttrium +针針 8470 zhen1 needle 1093 +钉釘 8172 ding1ding4 nail 2189 +钊釗 8270 zhao1 3521 +钋釙 8370 po4 polonium +钌釕 8772 diao3liao3 ruthenium +钍釷 8471 tu3 thorium +钎釺 8274 qian1 +钏釧 8270 chuan4 +钐釤 8272 shan1shan4 samarium +钑鈒 8774 ji2sa4 +钒釩 8771 fan2 +钓釣 8772 diao4 2280 +钔鍆 8772 men2 mendelevium +钕釹 8474 nv3 neodymium +钖鍚 8772 xi2xi1 +钗釵 8774 chai1 3334 +钘鈃 8174 xing2jian1 +钙鈣 8172 gai4 calcium +钚鈈 8179 bu4 plutonium +钛鈦 8473 tai4 +钜鉅 8171 ju4 +钝鈍 8571 dun4 3215 +钞鈔 8972 chao1 2532 +钟鍾 8570 zhong1 bell clock 760 +钠鈉 8472 na4 sodium +钡鋇 8778 bei4 barium +钢鋼 8772 gang1gang4 steel 1467 +钣鈑 8274 ban3 +钤鈐 8872 qian2 +钥鑰 8772 yao4yue4 2069 +钦欽 8778 qin1 1990 +钧鈞 8772 jun1 2306 +钨鎢 8772 wu4wu1 tungsten +钩鈎 8772 gou1 2202 +钪鈧 8071 kang4 scandium +钫鈁 8072 fang1 francium +钬鈥 8978 huo2huo3 holmium +钭鈄 8470 dou3 +钮鈕 8771 niu3 knob 2570 +钯鈀 8771 ba3pa2 palladium +钰鈺 8171 yu4 3722 +钱錢 8375 qian2jian3 money 424 +钲鉦 8171 zheng1 +钳鉗 8477 qian2 3406 +钴鈷 8476 gu3 cobalt +钵缽 8573 bo1 3552 +钶鈳 8172 e1ke1 +钷鉕 8171 po1po3 promethium +钸鈽 8472 bu4 +钹鈸 8374 ba2bo2 +钺鉞 8375 yue4hui4 +钻鑽 8176 zuan4zuan1 1662 +钼鉬 8670 mu4 molybdenum +钽鉭 8671 dan4tan3 tantalum +钾鉀 8675 jia3 potassium +钿鈿 8670 dian4tian2 +铀鈾 8576 you2 uranium +铁鐵 8578 tie3 iron 636 +铂鉑 8670 bo2 platinum +铃鈴 8873 ling2 bell 1829 +铄鑠 8279 shuo4 +铅鉛 8776 qian1yan2 lead 2777 +铆鉚 8772 liu3mao3 +铇鉋 8771 bao4 +铈鈰 8072 shi4 cerium +铉鉉 8073 xuan4 +铊鉈 8371 ta1tuo2 thallium +铋鉍 8370 bi4 bismuth +铌鈮 8771 ni3 niobium +铍鈹 8474 pi1pi2 beryllium +铎鐸 8775 duo2 3256 +铏鉶 8270 xing2 +铐銬 8472 kao4 3757 +铑銠 8471 lao3 rhodium +铒鉺 8174 er4 erbium +铓鋩 8471 mang2 +铔錏 8171 ya4 +铕銪 8472 you3 europium +铖鋮 8375 cheng2 +铗鋏 8578 jia2 +铘鋣 8772 ye2 +铙鐃 8571 nao2 +铚銍 8171 zhi4 +铛鐺 8977 dang1cheng1 +铜銅 8772 tong2 copper 1732 +铝鋁 8676 lv3 alumina 3800 +铞銱 8672 diao4 +铟銦 8670 yin1 indium +铠鎧 8271 kai3 +铡鍘 8270 zha2 +铢銖 8579 zhu1 +铣銑 8471 xian3xi3 +铤鋌 8274 ting3 +铥銩 8273 diu1 +铦銛 8276 xian1 +铧鏵 8474 hua2 +铨銓 8871 quan2 3916 +铩鎩 8479 sha1 +铪鉿 8876 ha1ke1 hafnium +铫銚 8271 yao2tiao2 +铬鉻 8776 ge4ge2luo4 chromium +铭銘 8776 ming2 1998 +铮錚 8775 zheng1 3159 +铯銫 8771 se4 caesium +铰鉸 8074 jiao3 +铱銥 8073 yi3yi1 iridium +铲鏟 8070 chan3 spade shovel 2954 +铳銃 8071 chong4 +铴鐋 8772 tang4 +铵銨 8374 an1 +银銀 8773 yin2 silver 605 +铷銣 8670 ru3ru2 rubidium +铸鑄 8574 zhu4 2586 +铹鐒 8472 lao2 lawrencium +铺鋪 8372 pu1pu4 1410 +铻鋙 8176 wu2yu3 +铼錸 8579 lai2 rhenium +铽鋱 8374 te4 terbium +链鏈 8473 lian4 2014 +铿鏗 8771 keng1 3676 +销銷 8972 xiao1 1195 +锁鎖 8978 suo3 lock 1198 +锂鋰 8671 li3 lithium +锃鋥 8671 zheng4zeng4 +锄鋤 8472 chu2 3498 +锅鍋 8672 guo1 pan 2087 +锆鋯 8476 gao4 zirconium +锇鋨 8375 e2 osmium +锈銹 8272 xiu4 3462 +锉銼 8871 cuo4 +锊鋝 8274 lue4 +锋鋒 8775 feng1 1495 +锌鋅 8074 xin1 zinc +锍鋶 8071 liu3 +锎鐦 8772 kai1 californium +锏鐧 8772 jian3jian4 +锐銳 8871 rui4dui4yue4 1908 +锑銻 8872 ti4ti1 antimony +锒鋃 8373 lang2 +锓鋟 8774 qin3 +锔鋦 8772 ju2ju1 curium +锕錒 8172 a1 actinium +锖錆 8572 qiang1 +锗鍺 8476 duo3zhe3 germanium +锘鍩 8476 tian3nuo4 nobelium +错錯 8476 cuo4cu4 error mistake 553 +锚錨 8476 mao2 anchor 3597 +锛錛 8474 ben1 +锜錡 8472 qi2yi3 +锝鍀 8674 de2 technetium +锞錁 8679 kua3ke4 +锟錕 8671 kun1 +锠錩 8676 chang1 +锡錫 8672 xi2ti4 tin 2173 +锢錮 8670 gu4 +锣鑼 8672 luo2 2897 +锤錘 8271 chui2 2881 +锥錐 8071 zhui1 3099 +锦錦 8672 jin3 1478 +锧鑕 8278 zhi4 +锨杴 8778 xian1 +锩錈 8971 juan4 +锪鍃 8773 huo1huo4 +锫錇 8076 pou2pei2 berkelium +锬錟 8978 tan2 +锭錠 8378 ding4 ingot 3075 +键鍵 8574 jian4 key 1822 +锯鋸 8776 ju4ju1 3101 +锰錳 8771 meng3 manganese +锱錙 8276 zi1 +锲鍥 8778 qie4 +锳鍈 8478 ying1 +锴鍇 8276 kai3 +锵鏘 8774 qiang1 3519 +锶鍶 8673 song1si1 strontium +锷鍔 8672 e4 +锸鍤 8277 cha2 +锹鍬 8978 qiao1 +锺鍾 8211 zhong1 +锻鍛 8774 duan4 2884 +锼鎪 8774 sou1 +锽鍠 8671 huang2 +锾鍰 8274 huan2 +锿鎄 8073 ai1 einsteinium +镀鍍 8074 du4 3855 +镁鎂 8878 mei3 magnesium +镂鏤 8974 lou4 +镃鎡 8873 zi1 +镄鐨 8578 fei4 fermium +镅鎇 8776 mei2 americium +镆鏌 8478 mo4 +镇鎮 8478 zhen4 910 +镈鎛 8374 bo2 +镉鎘 8172 ge2li4 cadmium +镊鑷 8174 nie4 +镋鎲 8971 tang3 +镌鎸 8072 juan1 3926 +镍鎳 8679 nie4 +镎鎿 8875 na2 neptunium +镏鎦 8776 liu2liu4 +镐鎬 8072 hao4gao3 +镑鎊 8072 bang4 3713 +镒鎰 8871 yi4 +镓鎵 8373 jia1 gallium +镔鑌 8378 bin1 +镕鎔 8376 rong2 3302 +镖鏢 8179 biao1 2844 +镗鏜 8971 tang1 +镘鏝 8674 man4 +镙鏍 8679 luo2 +镚鏰 8272 beng4 +镛鏞 8072 yong1 +镜鏡 8071 jing4 mirror 1206 +镝鏑 8072 di2 dysprosium +镞鏃 8878 zu2 +镟鏇 8878 xuan4 +镠鏐 8772 liu2 +镡鐔 8174 xin2 +镢鐝 8178 jue2 +镣鐐 8479 liao4 +镤鏷 8278 pu2 protactinium +镥鑥 8776 lu3 lutetium +镦鐓 8874 dui4 +镧鑭 8772 lan4lan2 lanthanum +镨鐠 8876 pu3 praseodymium +镩鑹 8375 cuan4cuan1 +镪鏹 8673 qiang3 +镫鐙 8271 deng4 +镬鑊 8474 huo4 +镭鐳 8176 lei2 radium +镮鐶 8673 huan2 +镯鐲 8672 zhuo2 3785 +镰鐮 8073 lian2 +镱鐿 8073 yi4 ytterbium +镲鑔 8379 cha3 +镳鑣 8073 biao1 +镴鑞 8271 la4 +镵鑱 8771 chan2 +镶鑲 8073 xiang1rang2 2710 +長长 7173 chang2zhang3 u +镸 7173 chang2 +镹 7778 jiu3 +镺 7278 ao3ao4 +镻 7578 die2 +镼 7777 qu1jue2 +镽 7479 liao3 +镾 7172 mi2 +长長 4273 chang2zhang3 long length 90 +門门 7700 men2 u +閁 7720 ma4 +閂闩 7710 shuan1 +閃闪 7780 shan3 +閄 7820 huo4 +閅 7720 men2 +閆闫 7710 yan2yan3yan4 +閇 7723 bi4 +閈闬 7740 han4 +閉闭 7724 bi4 +閊 7777 shan1 +開开 7744 kai1 +閌闶 7721 kang4kang1 +閍 7722 beng1 +閎闳 7773 hong2 +閏闰 7710 run4 +閐 7771 san4 +閑闲 7790 xian2 +閒 7722 xian2jian1jian4 +間间 7760 jian1jian4jian3 +閔闵 7740 min3min2 +閕 7724 xia1xia4 +閖 7790 lao4 +閗 7740 dou4 +閘闸 7750 zha2 +閙 7722 nao4 +閚 7710 zhan1 +閛 7740 peng1 +閜 7762 xia3ke3 +閝 7730 ling2 +閞 7744 bian4 +閟 7733 bi4 +閠 7710 run4 +閡阂 7728 he2 +関 7780 guan1 +閣阁 7760 ge2 +閤 7760 ge2he2 +閥阀 7725 fa2 +閦 7788 chu4 +閧 7780 hong4 +閨闺 7710 gui1 +閩闽 7713 min3 +閪 7760 se1xi1 +閫阃 7760 kun3 +閬阆 7773 lang3 +閭闾 7760 lv2 +閮 7740 ting2 +閯 7712 sha4 +閰 7777 ju2 +閱阅 7721 yue4 +閲阅 7721 yue4 +閳 7750 chan3 +閴 7780 qu4 +閵 7721 lin4 +閶阊 7760 chang1 +閷 4792 shai4sha1 +閸 7710 kun3 +閹阉 7771 yan1 +閺 7740 wen2min2 +閻阎 7777 yan2 +閼阏 7723 e4yan1 +閽阍 7760 hun1 +閾阈 7715 yu4 +閿阌 7740 wen2 +闀 7771 xiang4 +闁 7722 bao1 +闂 7771 xiang4 +闃阒 7780 qu4 +闄 7740 yao3 +闅 7740 wen2 +闆板 7766 ban3 +闇 7760 an4an1yan3 +闈闱 7750 wei2 +闉 7710 yin1 +闊阔 7716 kuo4 +闋阕 7780 que4 +闌阑 7790 lan2lan4 +闍阇 7760 du1she2 +闎 7790 quan2 +闏 7721 phdeng +闐阗 7780 tian2 +闑 7790 nie4 +闒阘 7712 ta4 +闓闿 7710 kai3kai1 +闔阖 7710 he2ge2 +闕阙 7748 que4que1 +闖闯 7732 chuang3 +闗 7733 guan1 +闘 7714 dou4 +闙 7760 qi3 +闚 7751 kui1kui3 +闛 7710 tang2chang1tang1 +關关 7777 guan1 +闝 7784 piao2 +闞阚 7714 kan4 +闟 7712 xi4ta4sa4 +闠阓 7780 hui4 +闡阐 7750 chan3 +闢 7764 pi4 +闣 7760 dang4 +闤阛 7773 huan2 +闥闼 7730 ta4 +闦 7710 wen2 +闧 7730 u1 +门門 3700 men2 door 137 +闩閂 3710 shuan1 +闪閃 3780 shan3 1096 +闫閆 3710 yan4 +闬閈 3740 han4 +闭閉 3724 bi4 1014 +问問 3760 wen4 82 +闯闖 3712 chuang3 1901 +闰閏 3710 run4 leap 3772 +闱闈 3752 wei2 +闲閑 3790 xian2 1105 +闳閎 3773 hong2 +间間 3760 jian1jian4 111 +闵閔 3740 min3 3326 +闶閌 3721 kang4kang1 +闷悶 3733 men4 1608 +闸閘 3750 zha2 3020 +闹鬧 3722 nao4 1119 +闺閨 3710 gui1 2757 +闻聞 3740 wen2 488 +闼闥 3730 ta4 +闽閩 3713 min3 3165 +闾閭 3760 lv2 +闿闓 3771 kai3kai1 +阀閥 3725 fa2 2947 +阁閣 3760 ge2 1518 +阂閡 3780 he2gai1 3878 +阃閫 3760 kun3 +阄鬮 3771 jiu1 +阅閱 3721 yue4 read 1646 +阆閬 3773 lang4 +阇闍 3760 du1she2 +阈閾 3715 yu4 +阉閹 3771 yan1 +阊閶 3760 chang1 +阋鬩 3721 xi4 +阌閿 3740 wen2 +阍閽 3760 hun1 +阎閻 3777 yan2 2517 +阏閼 3723 e4 +阐闡 3750 chan3 2829 +阑闌 3790 lan2 3288 +阒闃 3780 qu4 +阓闠 3780 hui4 +阔闊 3716 kuo4 1545 +阕闋 3780 que4 +阖闔 3710 ge2he2 3617 +阗闐 3780 tian2 +阘闒 3712 ta4 +阙闕 3748 que4que1 3170 +阚闞 3744 kan4 +阛闤 3773 huan2 +阜 2740 fu4 u 3409 +阝 7722 fu4yi4 +阞 7422 le4 +队隊 7820 dui4 team 548 +阠 7221 xin4 +阡 7224 qian1 +阢 7121 wu4wei4 +阣 7821 yi4 +阤 7521 tuo2yi3zhi4 +阥 7229 yin1 +阦 7928 yang2 +阧 7420 dou3 +阨 7121 e4ai4 +阩 7420 sheng1 +阪坂 7224 ban3 +阫 7129 pei2pei1 +阬 7021 keng1gang1 +阭 7321 yun3 +阮 7121 ruan3juan4yuan2 2474 +阯 7121 zhi3 +阰 7221 pi2 +阱 7424 jing3 3199 +防 7022 fang2 801 +阳陽 7620 yang2 483 +阴陰 7722 yin1 feminine cloudy shady negative 948 +阵陣 7425 zhen4 622 +阶階 7822 jie1 1003 +阷 7121 cheng1 +阸 7321 e4ai4 +阹 7423 qu1 +阺 7224 di3 +阻 7721 zu3zhu4 1218 +阼 7821 zuo4 +阽 7126 dian4yan2 +阾 7823 ling3 +阿 7122 a1e1 547 +陀 7321 tuo2 2638 +陁 7821 tuo2yi3 +陂 7424 bei1 +陃 7122 bing3 +附 7420 fu4 1055 +际際 7129 ji4 562 +陆陸 7527 lu4 six 1008 +陇隴 7321 long3 3201 +陈陳 7429 chen2 618 +陉陘 7721 xing2jing4 +陊 7722 duo4 +陋 7121 lou4 2612 +陌 7126 mo4 2182 +降 7725 jiang4xiang2 963 +陎 7529 shu1 +陏 7422 duo4 +限 7723 xian4 814 +陑 7122 er2 +陒 7721 gui3 +陓 7422 yu1wu1 +陔 7028 gai1 +陕陝 7528 shan3 2636 +陖 7324 xun4jun4 +陗 7922 qiao4 +陘陉 7121 xing2jing4 +陙 7123 chun2 +陚 7324 fu4 +陛 7221 bi4 2956 +陜 7428 xia2shan3 +陝陕 7428 shan3 +陞 7421 sheng1 +陟 7122 zhi4de2 +陠 7322 pu1 +陡 7428 dou3 2497 +院 7321 yuan4 336 +陣阵 7520 zhen4 +除 7829 chu2 487 +陥 7726 xian4 +陦 7524 dao3 +陧隉 7721 nie4 +陨隕 7628 yun3yuan2 +险險 7821 xian3yan2 737 +陪 7026 pei2 1201 +陫 7121 pei2fei3 +陬 7724 zou1zhe2 +陭 7422 yi1qi1yi4 +陮 7021 dui3 +陯 7822 lun2 +陰阴 7823 yin1 +陱 7722 ju1 +陲 7221 chui2 +陳陈 7529 chen2zhen4 +陴 7614 pi2bi4 +陵 7424 ling2 hill 1631 +陶 7722 tao2dao4yao2 1454 +陷 7727 xian4 1280 +陸陆 7421 lu4 +陹 7426 sheng1 +険 7828 xian3 +陻 7121 yin1 +陼 7426 zhu3du3 +陽阳 7622 yang2 +陾 7128 reng2 +陿 7121 shan3xia2 +隀 7221 chong2 +隁 7121 yan4 +隂 7823 yin1an1yin4 +隃 7822 yu2yao2 +隄 7628 di1ti2 +隅 7622 yu2 3282 +隆 7721 long2long1 1470 +隇 7325 wei1 +隈 7623 wei1 +隉陧 7721 nie4 +隊队 7828 dui4 +隋 7422 sui2duo4tuo3tuo1 3123 +隌 7026 an3 +隍 7621 huang2 +階阶 7226 jie1 +随隨 7423 sui2 359 +隐隱 7723 yin3yin4 883 +隑 7221 gai1gai4qi2 +隒 7823 yan3 +隓 7421 hui1 +隔 7122 ge2rong3ji1 1163 +隕陨 7628 yun3yuan2 +隖 7722 wu4 +隗 7621 wei3gui1kui2 +隘 7821 ai4e4 3486 +隙 7929 xi4 2315 +隚 7921 tang2 +際际 7729 ji4 +障 7024 zhang4zhang1 1530 +隝 7722 dao3 +隞 7824 ao2 +隟 7229 xi4 +隠 7223 yin3 +隡 7021 sa4 +隢 7421 rao4 +隣 7925 lin2 +隤 7528 tui2 +隥 7221 deng4 +隦 7024 pi3 +隧 7823 sui4zhui4 3140 +隨随 7423 sui2 +隩 7728 yu4ao4 +險险 7828 xian3yan2jian3 +隫 7428 fen1fen2 +隬 7122 ni3 +隭 7122 er2 +隮 7022 ji1 +隯 7424 dao3 +隰 7623 xi2xie4 +隱隐 7223 yin3yin4 +隲 7922 e2 +隳 7433 hui1 +隴陇 7121 long3 +隵 7325 xi1 +隶隸 5090 li4dai4yi4di4 u 2124 +隷 4599 li4 +隸隶 4599 li4 +隹 2021 zhui1cui1wei2 u +隺 4021 he4 +隻只 2040 zhi1 +隼 2040 zhun3sun3 +隽雋 2022 jun4juan4 3600 +难難 7041 nan2nan4nuo2 212 +隿 4001 yi4 +雀 9021 que4qiao1qiao3 2394 +雁 7121 yan4 2234 +雂 8021 qin2qian2 +雃 1041 ya3 +雄 4001 xiong2 male 950 +雅 7021 ya3ya1ya2 1073 +集 2090 ji2 set 435 +雇 3021 gu4 hire 2198 +雈 4421 huan2 +雉 8081 zhi4 +雊 2061 gou4 +雋隽 2022 jun4juan4 +雌 2011 ci2ci1 female 3210 +雍 0071 yong1 2709 +雎 7011 ju1 +雏雛 2011 chu2 3083 +雐 2121 hu1 +雑 4091 za2 +雒 2061 luo4 +雓 8091 yu2 +雔 2021 chou2 +雕 7021 diao1 1880 +雖虽 6011 sui1 +雗 4841 han4 +雘 7444 huo4 +雙双 2040 shuang1 +雚 4421 guan4 +雛雏 2041 chu2ju2ju4 +雜杂 0091 za2 +雝 2071 yong1 +雞鸡 2081 ji1 +雟 2222 xi1sui3 +雠讎 2021 chou2 +雡 1021 liu4 +離离 0021 li2 +難难 4081 nan2nan4nuo2 +雤 7721 xue2 +雥 2021 za2 +雦 2021 ji2 +雧 2091 ji2 +雨 1022 yu3yu4 u rain 716 +雩 1002 yu2 +雪 1017 xue3 snow 774 +雫 1023 na3 +雬 1090 fou3 +雭 1024 se4 +雮 1071 mu4 +雯 1040 wen2 2837 +雰 1022 fen1 +雱 1022 pang2 +雲云 1073 yun2 +雳靂 1022 li4 3669 +雴 1010 li4 +雵 1080 ang3 +零 1030 ling2 zero 1267 +雷 1060 lei2 thunder 741 +雸 1077 an2 +雹 1071 bao2bo2 3480 +雺 1022 meng2 +電电 1071 dian4 +雼 1060 dang4 +雽 1040 xing2 +雾霧 1042 wu4 fog 1682 +雿 1011 zhao4 +需 1022 xu1 650 +霁霽 1022 ji4 +霂 1039 mu4 +霃 1011 chen2 +霄 1022 xiao1xiao4 2652 +霅 1060 zha2 +霆 1040 ting2 3176 +震 1023 zhen4shen1 quiver 1108 +霈 1012 pei4 +霉 1050 mei2 2900 +霊 1010 ling2 +霋 1040 qi1 +霌 1022 chou1 +霍 1021 huo4 1841 +霎 1040 sha4 3158 +霏 1011 fei1 3661 +霐 1013 weng1 +霑 1016 zhan1 +霒 1872 yin1 +霓 1021 ni2 3080 +霔 1011 zhu4 +霕 1071 tun2 +霖 1099 lin2 2825 +霗 1013 ling2 +霘 1012 dong4 +霙 1080 ying1 +霚 1024 wu4 +霛 1022 ling2 +霜 1096 shuang1 frost 1842 +霝 1066 ling2ling4 +霞 1024 xia2 1642 +霟 1018 hong2 +霠 1012 yin1 +霡霢 1029 mo4mai4 +霢霡 1021 mai4 +霣 1080 yun3 +霤 1060 liu4 +霥 1023 meng4 +霦 1092 bin1 +霧雾 1022 wu4 +霨 1024 wei4 +霩 1042 kuo4 +霪 1011 yin2 +霫 1060 xi2 +霬 1080 yi4 +霭靄 1072 ai3 3739 +霮 1011 dan4 +霯 1010 deng4 +霰 1024 xian4 +霱 1022 yu4 +露 1016 lu4lou4 675 +霳 1021 long2 +霴 1579 dai4 +霵 1015 ji2 +霶 1012 pang2pang1 +霷 1062 yang2 +霸 1052 ba4 1743 +霹 1064 pi1 3368 +霺 1024 wei2 +霻 1010 feng1 +霼 1871 xi3xi4 +霽霁 1022 ji4 +霾 1021 mai2 +霿 1026 meng2 +靀 1023 meng2 +靁 1066 lei2 +靂雳 1021 li4 +靃 1021 huo4 +靄霭 1062 ai3 +靅 1578 fei4 +靆 1573 dai4 +靇 1021 long2 +靈灵 1010 ling2 +靉 1274 ai4 +靊 1010 feng1 +靋 1011 li4 +靌 1080 bao3 +靍 1022 he4 +靎 1012 he4 +靏 1022 he4 +靐 1066 bing4 +靑 5022 qing1 u +青 5022 qing1 365 +靓靚 5721 liang4jing4 3964 +靔 5821 tian1 +靕 1512 zhen1 +靖 0512 jing4 2403 +靗 5921 cheng4 +靘 5721 qing4 +静靜 5725 jing4 quiet 574 +靚靓 5621 liang4jing4 +靛 5328 dian4 +靜静 5225 jing4 +靝 5821 tian1 +非 1111 fei1 u negative 231 +靟 1171 fei1 +靠 2411 kao4 lean 746 +靡 0021 mi2 3028 +面 1060 mian4 u flour noodles 53 +靣 1060 mian4 +靤 1761 pao4 +靥靨 7126 ye4 +靦腼 1661 mian3 +靧 1568 hui4 +靨靥 7160 ye4 +革 4450 ge2 u 1074 +靪 4152 ding1 +靫 4754 cha2 +靬 4154 jian1 +靭 4754 ren4 +靮 4752 di2 +靯 4451 du4 +靰 4151 wu4 +靱 4752 ren4 +靲 4852 qin2 +靳 4252 jin4 3352 +靴 4451 xue1 3087 +靵 4751 niu3 +靶 4751 ba3ba4 3189 +靷 4250 yin3 +靸 4754 sa3ta1 +靹 4452 na4 +靺 4559 mo4 +靻 4751 zu3 +靼 4651 da2 +靽 4955 ban4 +靾 4451 yi4xie4 +靿 4452 yao4 +鞀鼗 4756 tao2 +鞁 4454 tuo2bei4 +鞂 4259 jia2 +鞃 4253 hong2 +鞄 4751 pao2bao4 +鞅 4558 yang3yang1 +鞆 4152 bing3 +鞇 4650 yin1 +鞈 4856 jia2ge2ta4 +鞉 4251 tao2 +鞊 4456 ji2 +鞋 4451 xie2wa1 shoe 1539 +鞌 3050 an1 +鞍 4354 an1 2704 +鞎 4753 hen2 +鞏巩 1750 gong3 +鞐 4153 qia3 +鞑韃 4453 da2 +鞒鞽 4252 qiao1 +鞓 4651 ting1 +鞔 4751 wan3men4 +鞕 4154 ying4 +鞖 4254 sui1 +鞗 2725 tiao2 +鞘 4952 qiao4shao1 3687 +鞙 4652 xuan4juan1 +鞚 4351 kong4 +鞛 4056 beng3 +鞜 4256 ta4 +鞝绱 4952 zhang3 +鞞 4654 bing3bi3pi2 +鞟 4054 kuo4 +鞠 4752 ju1 2799 +鞡 4051 la5 +鞢 4459 xie4 +鞣 4759 rou2 +鞤 4450 bang1 +鞥 4851 yi4eng1 +鞦 4958 qiu1 +鞧 4856 qiu1 +鞨 4652 he2mo4 +鞩 4250 xiao4 +鞪 1850 mu4mou2 +鞫 4752 ju2ju1qu1 +鞬 4554 jian1jian4 +鞭 4154 bian1 1934 +鞮 4658 di1 +鞯韉 4454 jian1 +鞰 4651 wen1yun4 +鞱 4257 tao1 +鞲 4554 gou1 +鞳 4456 ta4 +鞴 4452 bei4 +鞵 4258 xie2 +鞶 2750 pan2 +鞷 1040 ge2 +鞸 4655 bi4 +鞹 4752 kuo4 +鞺 4951 tang1 +鞻 4554 lou2lv3 +鞼 4558 gui4 +鞽鞒 4252 qiao2 +鞾 4455 xue1 +鞿 4455 ji1 +韀 4052 jian1 +韁缰 4151 jiang1 +韂 4756 chan4 +韃鞑 4453 da2 +韄 4454 huo4 +韅 4653 xian3 +韆 4153 qian1 +韇 4458 du2 +韈 4455 wa4 +韉鞯 4452 jian1 +韊 4452 lan2 +韋韦 4050 wei2 u +韌韧 4754 ren4 +韍韨 4354 fu2 +韎 4559 mei4 +韏 9050 juan4 +韐 4856 ge2 +韑 9421 wei3 +韒 4952 qiao4 +韓韩 4445 han2 +韔 4153 chang4 +韕 4054 kuo4 +韖 4759 rou2 +韗 4755 yun4 +韘 4459 she4 +韙韪 6480 wei3 +韚 4455 ge2 +韛 4452 bei4 +韜韬 4257 tao1tao4 +韝 4555 gou1 +韞韫 4651 yun4wen1 +韟 4654 gao1 +韠 4655 bi4 +韡 4455 wei3 +韢 4553 hui4 +韣 4652 du2 +韤 4455 wa4 +韥 4458 du2 +韦韋 5002 wei2 1681 +韧韌 5702 ren4 3299 +韨韍 5304 fu2 +韩韓 4542 han2 1275 +韪韙 6580 wei3 +韫韞 5601 yun4 +韬韜 5207 tao1 3435 +韭 1110 jiu3 u +韮 4410 jiu3 +韯 4315 xian1 +韰 2710 xie4 +韱 8315 xian1 +韲 0010 ji1 +音 0060 yin1 u 340 +韴 0162 za2 +韵韻 0762 yun4 1913 +韶 0766 shao2 2960 +韷 0267 le4 +韸 0765 peng2 +韹 0661 heng2 +韺 0468 ying1 +韻韵 0668 yun4 +韼 0763 peng2 +韽 8066 yin1an1 +韾 4760 yin1 +響响 2760 xiang3 +頀 0464 hu4huo4 +頁页 1080 ye4 u +頂顶 1128 ding3 +頃顷 2178 qing3 +頄 4108 qiu2 +項项 1118 xiang4 +順顺 2108 shun4 +頇顸 1148 han1an4 +須须 2128 xu1 +頉 2118 yi2 +頊顼 1118 xu4 +頋 7128 gu4 +頌颂 8178 song4 +頍 4148 kui3 +頎颀 7128 qi2ken3 +頏颃 0128 hang2 +預预 1128 yu4 +頑顽 1128 wan2 +頒颁 8128 ban1 +頓顿 5178 dun4 +頔 5168 di2 +頕 2168 dan1 +頖 9158 pan4 +頗颇 4128 po1 +領领 8138 ling3 +頙 1118 ce4 +頚 1118 jing3 +頛 5198 lei3 +頜颌 8168 he2ge2 +頝 0148 qiao1 +頞 3148 e4 +頟 2168 e2 +頠 2128 wei3 +頡颉 4168 jie2 +頢 2168 kuo4 +頣 7178 shen3 +頤颐 7178 yi2 +頥 2108 shen3 +頦颏 0188 ke2 +頧 2178 dui1 +頨 1128 pian1 +頩 8148 ping1 +頪 9198 lei4 +頫 3128 fu3tiao4 +頬 4108 jia2 +頭头 1118 tou2tou5 +頮颒 1148 hui4 +頯 2148 kui2qiu2 +頰颊 4108 jia2 +頱 2138 le4 +頲颋 1148 ting3 +頳 4138 cheng1 +頴颕 2198 ying3 +頵 1168 jun1yun1 +頶 2168 hu2 +頷颔 8168 han4 +頸颈 1118 jing3geng3 +頹颓 2128 tui2 +頺 2128 tui2 +頻频 2128 pin2bin1 +頼 5198 lai4 +頽颓 2128 tui2 +頾 2111 zi1 +頿 2118 zi1 +顀 2128 chui2 +顁 3188 ding4 +顂 4198 lai4 +顃 9188 yan2 +顄 1178 han4 +顅 7128 jian1 +顆颗 6198 ke1 +顇 0148 cui4 +顈 2198 jiong3 +顉 8118 qin1han4 +顊 2148 yi2 +顋 6138 sai1 +題题 6180 ti2di4 +額额 3168 e2 +顎颚 6128 e4 +顏颜 0128 yan2 +顐 7158 hun2hun4 +顑 5128 kan3 +顒颙 6128 yong2 +顓颛 2128 zhuan1 +顔颜 0128 yan2ya2 +顕 6118 xian3 +顖 2138 xin4 +顗 2118 yi3 +願愿 7128 yuan4 +顙颡 1198 sang3 +顚 2188 dian1 +顛颠 2188 dian1 +顜 5148 jiang3 +顝 7128 ku1 +類类 9188 lei4 +顟 1128 liao2 +顠 1198 piao4 +顡 0128 yi4 +顢颟 4128 man2man1 +顣 5128 qi1cu4 +顤 4128 rao4 +顥颢 6198 hao4 +顦 2138 qiao2 +顧顾 3128 gu4 +顨 1122 xun4 +顩 8188 yan3 +顪 2128 hui1hui4 +顫颤 0118 zhan4chan4 +顬颥 1128 ru2 +顭 4128 hong1 +顮 3188 bin1 +顯显 6138 xian3 +顰颦 2140 pin2 +顱颅 2128 lu2 +顲 9168 lan3 +顳颞 1118 nie4 +顴颧 4128 quan2 +页頁 1080 ye4 page 1172 +顶頂 1128 ding3 top 859 +顷頃 2178 qing3 2387 +顸頇 1148 han1 +项項 1118 xiang4 697 +顺順 2108 shun4 690 +须須 2128 xu1 473 +顼頊 1118 xu4 +顽頑 1128 wan2 2156 +顾顧 7128 gu4 599 +顿頓 5178 dun4 794 +颀頎 7128 qi2ken3 +颁頒 8128 ban1 2577 +颂頌 8178 song4 2462 +颃頏 0128 hang2 +预預 1128 yu4 837 +颅顱 2128 lu2 3280 +领領 8138 ling3 344 +颇頗 4128 po1 1444 +颈頸 1118 jing3geng3 neck 1896 +颉頡 4168 jie2jia2xie2 +颊頰 5188 jia2 2469 +颋頲 1148 ting3 +颌頜 8168 ge2he2 +颍潁 2198 ying3 +颎熲 2188 jiong3 +颏頦 0188 ke2 chin +颐頤 7178 yi2 3124 +频頻 2128 pin2bin1 1523 +颒頮 1148 hui4 +颓頹 2128 tui2 2986 +颔頷 8168 han4 3627 +颕頴 2198 ying3 +颖穎 2198 ying3 2159 +颗顆 6198 ke1 1381 +题題 6180 ti2di4 287 +颙顒 6128 yong2 +颚顎 6128 e4 jaw +颛顓 2128 zhuan1 +颜顏 0128 yan2 1145 +额額 3168 e2 1100 +颞顳 1148 nie4 +颟顢 4128 man2man1 +颠顛 4188 dian1 2180 +颡顙 7198 sang3 +颢顥 6198 hao4 +颣 9198 lei4 +颤顫 0118 zhan4chan4 quiver 1975 +颥顬 1128 ru2 +颦顰 2140 pin2 +颧顴 4128 quan2 +風风 7721 feng1 u +颩 7221 biao1diu1 +颪 1021 gua1 +颫 7521 fu2 +颬 7121 xia1 +颭飐 7121 zhan3 +颮飑 7721 biao1pao2 +颯飒 0711 sa4li4 +颰 7321 ba2 +颱台 7321 tai2 +颲 7221 lie4 +颳刮 7221 gua1 +颴 7821 xuan4 +颵 7921 shao4 +颶飓 7621 ju4 +颷 7921 bi1 +颸飔 7621 si1 +颹 7421 wei3 +颺飏 7621 yang2 +颻飖 2771 yao2 +颼飕 7721 sou1 +颽 2711 kai3 +颾 7721 sao1 +颿 7731 fan1 +飀飗 7721 liu2 +飁 1761 xi2 +飂 7721 liao2liu4 +飃 7121 piao1 +飄飘 1791 piao1 +飅 7121 liu2 +飆飙 4741 biao1 +飇 7321 biao1 +飈飚 7921 biao1 +飉 7421 liao2 +飊 9781 biao1 +飋 7121 se4 +飌 4721 feng1 +飍 7721 biao1xiu1 +风風 7721 feng1 wind 235 +飏颺 7721 yang2 +飐颭 7121 zhan3 +飑颮 7721 biao1 +飒颯 0711 sa4 3612 +飓颶 7721 ju4 +飔颸 7621 si1 +飕颼 7721 sou1 3983 +飖颻 2771 yao2 +飗飀 7721 liu2 +飘飄 1791 piao1 1484 +飙飆 4781 biao1 3885 +飚飈 7921 biao1 +飛飞 1241 fei1 u +飜 2261 fan1 +飝 1241 fei1 +飞飛 1201 fei1 fly 412 +食 8073 shi2si4yi4 u 727 +飠饣 8070 shi2 +飡 3813 can1sun1 +飢饥 8771 ji1 +飣饤 8172 ding4 +飤 8870 si4 +飥饦 8271 tuo1 +飦 8174 zhan1 +飧 2823 sun1 +飨饗 2823 xiang3 3904 +飩饨 8571 tun2tun5zhun4 +飪饪 8271 ren4 +飫饫 8278 yu4 +飬 9073 juan4yang3 +飭饬 8872 chi4shi4 +飮 8778 yin3 +飯饭 8274 fan4 +飰 8073 fan4 +飱 1823 sun1 +飲饮 8778 yin3yin4 +飳 8071 zhu4 +飴饴 8376 yi2si4 +飵 8871 zuo4zhai3 +飶 8370 bi4 +飷 8771 jie3 +飸 6823 tao1 +飹 8772 liu3 +飺 2273 ci2 +飻 8872 tie4 +飼饲 8772 si4 +飽饱 8771 bao3 +飾饰 8872 shi4chi4 +飿饳 8277 duo4 +餀 8474 hai4 +餁 8271 ren4 +餂 8276 tian3 +餃饺 8074 jiao3jiao4 +餄饸 8876 jia2he2 +餅饼 8874 bing3 +餆 8271 yao2 +餇 8772 tong2 +餈 3773 ci2zi1 +餉饷 8772 xiang3 +養养 8073 yang3 +餋 9073 yang3 +餌饵 8174 er3 +餍饜 7123 yan4 +餎饹 8776 le5 +餏饻 8073 yi1 +餐 2773 can1sun4 meal 1303 +餑饽 8474 bo1bo2 +餒馁 8274 nei3 +餓饿 8375 e4 +餔 8372 bu1bu3 +餕馂 8374 jun4 +餖饾 8171 dou4 +餗 8579 su4 +餘余 8879 yu2ye2 +餙 8472 shi4 +餚肴 8472 yao2 +餛馄 8671 hun2kun1 +餜馃 8679 guo3 +餝 8472 shi4 +餞饯 8375 jian4 +餟 8774 zhui4 +餠 8874 bing3 +餡馅 8777 xian4kan4 +餢 8076 bu4 +餣 8471 ye4 +餤 8978 tan2dan4 +餥 1173 fei3 +餦 8173 zhang1 +餧 8274 wei4nei3 +館馆 8377 guan3 +餩 8878 e4 +餪 8178 nuan3 +餫 8775 hun2yun4 +餬 8772 hu2 +餭 8671 huang2 +餮 1873 tie4 +餯 8773 hui4 +餰 8172 jian1zhan1 +餱 8773 hou2 +餲 8672 he2ai4 +餳饧 8672 xing2tang2 +餴 8474 fen1 +餵 8673 wei4 +餶馉 8772 gu3 +餷馇 8471 cha1 +餸 8873 song4 +餹 8376 tang2 +餺馎 8374 bo2 +餻 8873 gao1 +餼饩 8871 xi4 +餽 8671 kui4 +餾馏 8776 liu4liu2 +餿馊 8774 sou1 +饀 8277 tao2 +饁馌 8471 ye4 +饂 8671 yun2 +饃馍 8478 mo2 +饄 8971 tang2 +饅馒 8674 man2 +饆 8675 bi4 +饇 8171 yu4 +饈馐 8871 xiu1 +饉馑 8471 jin3 +饊馓 8874 san3 +饋馈 8578 kui4 +饌馔 8778 zhuan4 +饍 8876 shan4 +饎 8476 chi4xi1 +饏 1873 dan4 +饐 8471 yi4 +饑饥 8275 ji1qi2 +饒饶 8471 rao2 +饓 8979 cheng1 +饔 0073 yong1 +饕 6173 tao1 +饖 8175 hui4 +饗飨 2773 xiang3 +饘 8071 zhan1 +饙 8478 fen1 +饚 8471 hai4 +饛 8473 meng2 +饜餍 7123 yan4 +饝 8076 mo2 +饞馋 8771 chan2 +饟 8073 xiang3 +饠 8671 luo2 +饡 8478 zuan4zan4 +饢馕 8573 nang3nang2 +饣飠 2770 shi2 +饤飣 2172 ding4 +饥飢 2771 ji1 hungry 2267 +饦飥 2271 tuo1 +饧餳 2772 xing2 +饨飩 2571 tun2tun5 +饩餼 2871 xi4 +饪飪 2271 ren4 +饫飫 2278 yu4 +饬飭 2872 chi4 +饭飯 2274 fan4 rice 769 +饮飲 2778 yin3yin4 drink 1380 +饯餞 2375 jian4 3874 +饰飾 2872 shi4 1494 +饱飽 2771 bao3 1669 +饲飼 2772 si4 3008 +饳飿 2277 duo4 +饴飴 2376 yi2si4 +饵餌 2174 er3 3628 +饶饒 2571 rao2 2099 +饷餉 2772 xiang3 +饸餄 2876 jia2he2 +饹餎 2776 le5 +饺餃 2074 jiao3 dumpling 3861 +饻餏 2073 yi1 +饼餅 2874 bing3 cake 2243 +饽餑 2474 bo2bo1 +饾餖 2171 dou4 +饿餓 2375 e4 1958 +馀餘 2879 yu2 3965 +馁餒 2274 nei3 3640 +馂餕 2374 jun4 +馃餜 2679 guo3 +馄餛 2671 hun2 +馅餡 2777 xian4 3697 +馆館 2377 guan3 827 +馇餷 2471 cha1 +馈饋 2578 kui4 2871 +馉餶 2774 gu3 +馊餿 2774 sou1 +馋饞 2773 chan2 3794 +馌饁 2471 ye4 +馍饃 2478 mo2 +馎餺 2374 bo2 +馏餾 2776 liu4liu2 +馐饈 2871 xiu1 +馑饉 2471 jin3 +馒饅 2674 man2 3353 +馓饊 2874 san3 +馔饌 2778 zhuan4 +馕饢 2573 nang3nang2 +首 8060 shou3 u 377 +馗 4801 kui2qiu2 +馘 8365 guo2xu4 +香 2060 xiang1 u 518 +馚 2862 fen2 +馛 2364 ba2 +馜 2761 ni3 +馝 2360 bi4 +馞 2464 bo2 +馟 2264 tu2 +馠 2866 han1 +馡 2161 fei1 +馢 2365 jian1 +馣 2461 an1 +馤 2662 ai3 +馥 2864 fu4 3911 +馦 2863 xian1 +馧 2661 wen1 +馨 4760 xin1 2606 +馩 2468 fen2 +馪 2368 bin1 +馫 1066 xing1 +馬马 7132 ma3 u horse 5000 +馭驭 7734 yu4 +馮冯 3112 feng2ping2 +馯 7134 han4han2 +馰 7732 di4 +馱驮 7438 tuo2 +馲 7231 tuo1 +馳驰 7431 chi2 +馴驯 7230 xun4 +馵 7144 zhu4 +馶 7434 zhi1 +馷 7032 pei4 +馸 7230 xin4 +馹驲 7630 ri4 +馺 7734 sa4 +馻 7331 yin3 +馼 7034 wen2 +馽 7150 zhi2 +馾 7431 dan4 +馿 7330 lv2 +駀 7331 you2 +駁驳 7434 bo2 +駂 2142 bao3 +駃 7538 kuai4jue2 +駄 7433 tuo2 +駅 7738 yi4 +駆 7131 qu1 +駇 7834 wen2 +駈 7231 qu1 +駉 7732 jiong1 +駊 7434 bo3po3 +駋 7736 zhao1 +駌 2732 yuan1 +駍 7134 peng1 +駎 7536 zhou4 +駏 7131 ju4 +駐驻 7031 zhu4 +駑驽 4732 nu2 +駒驹 7732 ju1ju4 +駓 7131 pi1pi2 +駔驵 7731 zang3 +駕驾 4632 jia4jia1 +駖 7833 ling2 +駗 7832 zhen1 +駘骀 7336 tai2 +駙驸 7430 fu4 +駚 7538 yang3 +駛驶 7530 shi3 +駜 7330 bi4 +駝驼 7331 tuo2 +駞 7831 tuo2 +駟驷 7630 si4 +駠 7732 liu2 +駡骂 6632 ma4 +駢骈 7834 pian2 +駣 7231 tao2 +駤 7131 zhi4 +駥 7335 rong2 +駦 9032 teng2 +駧 7732 dong4 +駨 7732 xun2 +駩 7831 quan2 +駪 7431 shen1 +駫 7931 jiong1 +駬 7134 er3 +駭骇 7038 hai4 +駮 7034 bo2 +駯 7539 zhu1 +駰骃 7630 yin1 +駱骆 7736 luo4 +駲 7230 ping2 +駳 7234 dan4 +駴 7335 xie4 +駵 7137 liu2 +駶 7732 ju2 +駷 7539 song3 +駸骎 7734 qin1 +駹 7331 mang2 +駺 7333 liang2 +駻 7634 han4 +駼 7839 tu2 +駽 7632 xuan1 +駾 7831 tui4 +駿骏 7334 jun4 +騀 7335 e2e3 +騁骋 7532 cheng3 +騂骍 7034 xing1 +騃 7338 si4 +騄 7739 lu4 +騅骓 7031 zhui1 +騆 7732 zhou1 +騇 7836 she4 +騈 7234 pian2 +騉 7631 kun1 +騊 7732 tao2 +騋 7439 lai2 +騌骔 7339 zong1 +騍骒 7639 ke4 +騎骑 7432 qi2ji4 +騏骐 7438 qi2 +騐 7833 yan4 +騑 7131 fei1 +騒 7733 sao1 +験 7838 yan3 +騔 7632 jie2 +騕 7134 yao3 +騖骛 1832 wu4 +騗 3122 pian4 +騘 7733 cong1 +騙骗 7332 pian4 +騚 7832 qian2 +騛 7231 fei1 +騜 7631 huang2 +騝 7534 jian1 +騞 7536 huo1 +騟 7832 yu4 +騠 7638 ti2 +騡 7639 quan2 +騢 7734 xia2 +騣 7634 zong1 +騤骙 7238 kui2 +騥 7739 rou2 +騦 7633 si1 +騧䯄 7732 gua1 +騨 7635 tuo2 +騩 7631 gui1 +騪 7734 sou1 +騫骞 3032 qian1 +騬 7239 cheng2 +騭骘 7932 zhi4 +騮骝 7736 liu2 +騯 7032 pang2 +騰腾 7922 teng2 +騱 7238 xi1 +騲 7434 cao3 +騳 7132 du2 +騴 7634 yan4 +騵 7139 yuan2 +騶驺 7732 zou1 +騷骚 7733 sao1sao3 +騸骟 7332 shan4 +騹 7431 li2qi2 +騺 4932 zhi4 +騻 7438 shuang1 +騼 7331 lu4 +騽 7736 xi2 +騾骡 7639 luo2 +騿 7034 zhang1 +驀蓦 4432 mo4 +驁骜 5822 ao2 +驂骖 7332 can1 +驃骠 7139 piao4biao1 +驄骢 7633 cong1 +驅驱 7131 qu1 +驆 7634 bi4 +驇 4532 zhi4 +驈 7732 yu4 +驉 7131 xu1 +驊骅 7435 hua2 +驋 7234 bo1 +驌骕 7532 su4 +驍骁 7431 xiao1 +驎 7935 lin2 +驏骣 7734 chan3 +驐 7834 dun1 +驑 7136 liu2 +驒 7635 tuo2 +驓 7836 zeng1 +驔 7134 dian4 +驕骄 7232 jiao1 +驖 7335 tie3 +驗验 7838 yan4 +驘 0021 luo2 +驙 7031 zhan1 +驚惊 4832 jing1 +驛驿 7634 yi4 +驜 7239 ye4 +驝 7439 tuo1 +驞 7338 bin1 +驟骤 7733 zhou4 +驠 7433 yan4 +驡 0132 peng2 +驢驴 7131 lv2 +驣 7932 teng2 +驤骧 7033 xiang1 +驥骥 7238 ji4 +驦骦 7136 shuang1 +驧 7732 ju2 +驨 7232 xi1 +驩 7431 huan1 +驪骊 7131 li2 +驫骉 7132 biao1 +马馬 7712 ma3 horse 259 +驭馭 7714 yu4 2940 +驮馱 7418 tuo2 3596 +驯馴 7210 xun4 3250 +驰馳 7411 chi2 1929 +驱驅 7111 qu1 1565 +驲馹 7610 ri4 +驳駁 7414 bo2 2203 +驴驢 7310 lv2 donkey 2719 +驵駔 7711 zang3 +驶駛 7510 shi3 1946 +驷駟 7610 si4 +驸駙 7410 fu4 +驹駒 7712 ju1 colt 3164 +驺騶 7717 zou1 +驻駐 7011 zhu4 1703 +驼駝 7311 tuo2 2628 +驽駑 4712 nu2 +驾駕 4612 jia4 1551 +驿驛 7715 yi4 3121 +骀駘 7316 tai2 +骁驍 7511 xiao1 +骂罵 6612 ma4 scold 1541 +骃駰 7610 yin1 +骄驕 7212 jiao1 2161 +骅驊 7414 hua2 3977 +骆駱 7716 luo4 camel 2170 +骇駭 7018 hai4 2668 +骈駢 7814 pian2 +骉驫 7712 biao1 +骊驪 7112 li2 +骋騁 7512 cheng3 3574 +验驗 7811 yan4 745 +骍騂 7314 xin1 +骎駸 7714 qin1 +骏駿 7314 jun4 2880 +骐騏 7418 qi2 +骑騎 7412 qi2ji4 ride 1397 +骒騍 7619 ke4 +骓騅 7011 zhui1 +骔騌 7319 zong1 +骕驌 7512 su4 +骖驂 7312 can1 +骗騙 7312 pian4 1314 +骘騭 7112 zhi4 +骙騤 7218 kui2 +骚騷 7713 sao1sao3 disturb 2393 +骛騖 1812 wu4 +骜驁 5812 ao2 +骝騮 7716 liu2 +骞騫 3012 qian1 3968 +骟騸 7312 shan4 +骠驃 7119 piao4biao1 +骡騾 7619 luo2 3542 +骢驄 7613 cong1 +骣驏 7714 chan3 +骤驟 7713 zhou4 1902 +骥驥 7218 ji4 3518 +骦驦 7116 shuang1 +骧驤 7013 xiang1 +骨 7722 gu3gu1gu2 u bone 931 +骩 7421 wei3 +骪 7721 wei3 +骫 7521 wei3 +骬 7124 yu2 +骭 7124 gan4 +骮 7324 yi4 +骯肮 7021 ang1 +骰 7724 tou2gu3 +骱 7822 jie4 +骲 7721 bao1 +骳 7424 bi4bei4 +骴 7221 chi1ci1 +骵 7423 ti3ti1 +骶 7224 di3 +骷 7426 ku1 +骸 7028 hai2gai1 3085 +骹 7024 qiao1xiao1 +骺 7226 gou4hou2 +骻 7422 kua4 +骼 7726 ge2 3997 +骽 7224 tui3 +骾 7124 geng3 +骿 7824 pian2 +髀 7624 bi4 +髁 7629 ke1kua4 +髂 7326 ka4qia4ge2 +髃 7722 yu2 +髄 7423 sui3 +髅髏 7924 lou2 skull 3982 +髆 7324 bo2 +髇 6022 xiao1 +髈 7022 bang3 +髉 7421 bo1 +髊 7821 ci1 +髋髖 7321 kuan1 +髌髕 7328 bin4 +髍 7029 mo2 +髎 7722 liao2 +髏髅 7524 lou2 +髐 7421 xiao1 +髑 7622 du2 +髒脏 7424 zang1 +髓 7423 sui3 3078 +體体 7521 ti3 +髕髌 7328 bin4 +髖髋 7321 kuan1 +髗 7122 lu2 +高 0022 gao1 u high 87 +髙 0022 gao1 +髚 0021 qiao4 +髛 0721 kao1 +髜 0624 qiao1 +髝 0922 lao4 +髞 0629 zao4 +髟 7272 biao1 u +髠 7221 kun1 +髡 7221 kun1 +髢 7271 di2 +髣 7222 fang3 +髤 7290 xiu1 +髥 7244 ran2 +髦 7271 mao2 3238 +髧 7241 dan4 +髨 7221 kun1 +髩 7202 bin4 +髪 7240 fa4 +髫 7260 tiao2 +髬 7210 pi1 +髭 7211 zi1 +髮发 7240 fa4fa3 +髯 7255 ran2 +髰 7271 ti4 +髱 7271 pao4 +髲 7224 pi1bi4 +髳 7222 mao2 +髴 7252 fu2fei4 +髵 7222 er2 +髶 7240 rong2 +髷 7260 qu1 +髸 7280 gong1 +髹 7229 xiu1 +髺 7260 gua4kuo4 +髻 7260 ji4jie2 3767 +髼 7250 peng2 +髽 7210 zhua1 +髾 7222 shao1 +髿 7212 sha1suo1 +鬀 7222 ti4 +鬁 7292 li4 +鬂 7280 bin4 +鬃 7290 zong1 +鬄 7271 ti4di2di4 +鬅 7222 peng2 +鬆松 7293 song1 +鬇 7250 zheng1 +鬈 7271 quan2 +鬉 7240 zong1 +鬊 7260 shun4 +鬋 7222 jian1jian3 +鬌 7222 duo3 +鬍胡 7262 hu2 +鬎 7292 la4 +鬏 7298 jiu1 +鬐 7222 qi2 +鬑 7223 lian2 +鬒 7280 zhen3 +鬓鬢 7280 bin4 3134 +鬔 7230 peng2 +鬕 7280 mo4 +鬖 7220 san1 +鬗 7222 man4 +鬘 7240 man2 +鬙 7260 seng1 +鬚须 7228 xu1 +鬛 7271 lie4 +鬜 7222 qian1 +鬝 7222 qian1 +鬞 7223 nong2 +鬟 7273 huan2 3907 +鬠 7260 kuai4kuo4 +鬡 7220 ning2 +鬢鬓 7280 bin4 +鬣 7271 lie4 +鬤 7273 rang2 +鬥斗 7711 dou4 u +鬦 7740 dou4 +鬧闹 7722 nao4 +鬨 7780 hong4 +鬩阋 7721 xi4he4 +鬪 7714 dou4 +鬫 7744 kan4 +鬬 7712 dou4 +鬭 7712 dou4 +鬮阄 7711 jiu1 +鬯 2271 chang4 u +鬰 4472 yu4 +鬱郁 4472 yu4 +鬲 1022 li4ge2e4 u +鬳 2122 juan4 +鬴 1322 fu3 +鬵 7122 qian2xin2 +鬶 5722 gui1 +鬷 1224 zong1 +鬸 1726 liu4 +鬹 5622 gui1 +鬺 1822 shang1 +鬻 1722 yu4 +鬼 2651 gui3 u ghost 1309 +鬽 2251 mei4 +鬾 2451 ji4 +鬿 2251 qi2 +魀 2851 jie4 +魁 2451 kui2 2439 +魂 1671 hun2 soul 1341 +魃 2351 ba2 +魄 2661 po4 2322 +魅 2551 mei4 2248 +魆 2351 xu4xu1 +魇魘 7151 yan3 +魈 2951 xiao1 +魉魎 2151 liang3 +魊 2351 yu4 +魋 2051 tui2 +魌 2451 qi1 +魍 2751 wang3 +魎魉 2151 liang3 +魏 2641 wei4 1661 +魐 2851 jian1 +魑 2051 chi1 +魒 2151 piao1 +魓 2651 bi4 +魔 0021 mo2 1424 +魕 2255 ji3 +魖 2151 xu1 +魗 4661 chou3chou2 +魘魇 7121 yan3 +魙 3241 zhan3jian4 +魚鱼 2733 yu2 u +魛鱽 2732 dao1 +魜 2830 ren2 +魝 2230 ji4 +魞 2830 ba1ba4 +魟 2131 gong1hong2 +魠 2231 tuo2tuo1 +魡 2732 diao4 +魢鱾 2731 ji3 +魣 2732 xu4yu2 +魤 2430 e2 +魥 2734 e4 +魦 2932 sha1 +魧 2031 hang2 +魨鲀 2531 tun2 +魩 2732 mo4 +魪 2832 jie4 +魫 2431 shen3 +魬 2234 fan3ban3 +魭 2131 yuan2wan3 +魮 2231 bi2pi2 +魯鲁 2760 lu3lv3 +魰 2034 wen2 +魱 2131 hu2 +魲 2330 lu2 +魳 2132 za2 +魴鲂 2032 fang2 +魵 2832 fen2 +魶 2432 na4 +魷鱿 2331 you2 +魸 2232 pian4 +魹 2231 mo2 +魺鲄 2132 he2 +魻 2635 xia2 +魼 2433 qu1 +魽 2437 han1 +魾 2131 pi2pi1 +魿 2833 ling2 +鮀 2331 tuo2 +鮁鲅 2334 bo1ba4 +鮂 2630 qiu2 +鮃鲆 2734 ping2 +鮄 2532 fu2 +鮅 2330 bi4 +鮆 2233 ji4 +鮇 2539 wei4 +鮈 2732 ju1 +鮉 2736 diao1 +鮊鲌 2630 bo2ba4 +鮋鲉 2536 you2 +鮌 2033 gun3 +鮍鲏 2434 pi2 +鮎鲇 2136 nian2 +鮏 2531 xing1 +鮐鲐 2336 tai2 +鮑鲍 2731 bao4bao1pao1 +鮒鲋 2430 fu4 +鮓鲊 2831 zha3zha4 +鮔 2131 ju4 +鮕 2436 gu1 +鮖 2136 shi2 +鮗 2733 dong1 +鮘 2334 dai4 +鮙 2732 ta4 +鮚鲒 2436 jie2qia4 +鮛 2139 shu4shu1 +鮜鲘 2236 hou4 +鮝鲞 9033 xiang3zhen4 +鮞鲕 2132 er2 +鮟 2334 an4yan3 +鮠 2731 wei2 +鮡 2231 tiao1zhao4 +鮢 2539 zhu1 +鮣䲟 2732 yin4 +鮤 1233 lie4 +鮥 2736 luo4 +鮦鲖 2732 tong2 +鮧 2538 yi2 +鮨 2236 qi2yi4zhi1 +鮩 2834 bing4 +鮪鲔 2432 wei3 +鮫鲛 2034 jiao1jiao3 +鮬 2832 bu4ku1 +鮭鲑 2431 gui1xie2 +鮮鲜 2835 xian1xian3 +鮯 2836 ge2 +鮰 2630 hui2 +鮱 2431 lao3 +鮲 2338 fu2 +鮳鲓 2432 kao4 +鮴 2439 xiu1 +鮵 2831 duo2 +鮶鲪 2736 jun1 +鮷 2832 ti2 +鮸 2731 mian3man3 +鮹 2932 xiao1 +鮺鲝 8033 zha3 +鮻 2334 sha1 +鮼 2734 qin1 +鮽 2839 yu2 +鮾 2234 nei3 +鮿 2231 zhe2 +鯀鲧 2239 gun3 +鯁鲠 2134 geng3 +鯂 2136 su1 +鯃 2136 wu2 +鯄 2339 qiu2 +鯅 2234 shan1 +鯆 2332 fu3pu1 +鯇鲩 2331 wan3huan4 +鯈 2723 tiao2 +鯉鲤 2631 li3 +鯊鲨 3933 sha1 +鯋 2932 sha1 +鯌 2436 gao4 +鯍 2031 meng2 +鯎 2335 cheng2 +鯏 2230 li2 +鯐 2438 zou3 +鯑 2432 xi1 +鯒鲬 2732 yong3 +鯓 2734 ni2 +鯔鲻 2236 zi1 +鯕鲯 2438 qi2 +鯖鲭 2532 qing1zheng1 +鯗鲞 9033 xiang3 +鯘 2234 nei3 +鯙 2034 chun2 +鯚 2234 ji4 +鯛鲷 2732 diao1 +鯜 2034 qie4 +鯝鲴 2630 gu4 +鯞 2732 zhou3 +鯟 2539 dong1 +鯠 2439 lai2 +鯡鲱 2131 fei1fei4 +鯢鲵 2731 ni2 +鯣 2632 yi4 +鯤鲲 2631 kun1 +鯥 2431 lu4 +鯦 2836 jiu4 +鯧鲳 2636 chang1 +鯨鲸 2039 jing1 +鯩 2832 lun2 +鯪鲮 2434 ling2 +鯫鲰 2734 zou1 +鯬 2733 li2 +鯭 2731 meng3 +鯮 2339 zong1 +鯯 2230 zhi4 +鯰鲇 2833 nian2 +鯱 2131 hu3 +鯲 2833 yu2 +鯳 2034 di3 +鯴鲺 2731 shi1 +鯵 2332 shen1 +鯶 2735 huan4 +鯷鳀 2638 ti2 +鯸 2738 hou2 +鯹 2631 xing1 +鯺 2436 zhu1 +鯻 2230 la4 +鯼 2434 zong1 +鯽鲫 2732 ji4zei2 +鯾 2134 bian1 +鯿鳊 2332 bian1 +鰀 2234 huan4 +鰁鳈 2639 quan2 +鰂鲗 2230 zei2 +鰃鳂 2633 wei1 +鰄 2335 wei1 +鰅 2632 yu2 +鰆䲠 2536 qun1chun1 +鰇 2739 rou2 +鰈鲽 2439 die2 +鰉鳇 2631 huang2 +鰊 2539 lian4 +鰋 2131 yan3 +鰌䲡 2836 qiu2qiu1 +鰍鳅 2938 qiu1 +鰎 2534 jian4 +鰏鲾 2136 bi4bi1 +鰐鳄 2632 e4 +鰑 2632 yang2 +鰒鳆 2834 fu4 +鰓鳃 2633 sai1xi3 +鰔 2335 jian3 +鰕 2734 xia2xia1 +鰖 2432 tuo3wei3 +鰗 2732 hu2 +鰘 2331 shi4 +鰙 2436 ruo4 +鰚 2331 xuan1 +鰛 2631 wen1 +鰜鳒 2833 jian1 +鰝 2032 hao4 +鰞 2732 wu1 +鰟鳑 2032 pang2 +鰠鳋 2733 sao1 +鰡 2736 liu2 +鰢 2132 ma3 +鰣鲥 2434 shi2 +鰤 2132 shi1 +鰥鳏 2639 guan1 +鰦 2833 zi1 +鰧䲢 2923 teng2 +鰨鳎 2632 ta4ta3die2 +鰩鳐 2737 yao2 +鰪 2431 ge2 +鰫 2336 rong2yong2 +鰬 2134 qian2 +鰭鳍 2436 qi2 +鰮鳁 2631 wen1 +鰯 2732 ruo4 +鰰 2530 shen2 +鰱鲢 2533 lian2 +鰲鳌 4833 ao2 +鰳鳓 2432 le4 +鰴 2824 hui1 +鰵鳘 8833 min3 +鰶 2739 ji4 +鰷鲦 2739 tiao2 +鰸 2131 qu1 +鰹鲣 2731 jian1 +鰺鲹 2332 sao1shen1can1 +鰻鳗 2634 man2 +鰼鳛 2736 xi2 +鰽 2436 qiu2 +鰾鳔 2139 biao4 +鰿 2538 ji1ji2 +鱀 7133 ji4 +鱁 2133 zhu2 +鱂鳉 2734 jiang1 +鱃 2831 qiu1 +鱄 2534 zhuan1tuan2 +鱅鳙 2032 yong1 +鱆 2034 zhang1 +鱇 2039 kang1 +鱈鳕 2137 xue3 +鱉鳖 9833 bie1 +鱊 2732 jue2yu4 +鱋 2131 qu1 +鱌 2733 xiang4 +鱍 2234 bo1 +鱎 2232 jiao3 +鱏 2134 xun2 +鱐 2532 su4 +鱑 2438 huang2 +鱒鳟 2834 zun1 +鱓 2635 shan4tuo2 +鱔鳝 2836 shan4 +鱕 2236 fan1 +鱖鳜 2138 gui4 +鱗鳞 2935 lin2 +鱘鲟 2734 xun2 +鱙 2431 miao2 +鱚 2436 xi3 +鱛 2836 zeng1 +鱜 2732 xiang1 +鱝鲼 2438 fen4 +鱞 2632 guan1 +鱟鲎 7733 hou4 +鱠鲙 2836 kuai4 +鱡 2335 zei2 +鱢 2639 sao1 +鱣鳣 2031 zhan1shan4 +鱤鳡 2335 gan3 +鱥 2135 gui4 +鱦 2731 sheng2 +鱧鳢 2531 li3 +鱨鲿 2936 chang2 +鱩 2136 lei2 +鱪 2636 shu3 +鱫 2234 ai4 +鱬 2132 ru2 +鱭鲚 2832 ji4 +鱮 2738 xu4 +鱯鳠 2434 huo4hu4 +鱰 2636 shu3 +鱱 2132 li4 +鱲 2231 lie4 +鱳 2239 li4 +鱴 2434 mie4 +鱵 2835 zhen1 +鱶 2833 xiang3 +鱷鳄 2632 e4 +鱸鲈 2131 lu2 +鱹 2431 guan4 +鱺鲡 2131 li2li3 +鱻 2733 xian1 +鱼魚 2710 yu2 fish 1059 +鱽魛 2712 dao1 +鱾魢 2711 ji3 +鱿魷 2311 you2 +鲀魨 2511 tun2 +鲁魯 2760 lu3 1021 +鲂魴 2012 fang2 +鲃䰾 2711 ba1ba4 +鲄魺 2112 he2 +鲅鮁 2314 bo1ba4 +鲆鮃 2114 ping2 +鲇鮎 2116 nian2 +鲈鱸 2110 lu2 +鲉鮋 2516 you2 +鲊鮓 2811 zha3zha4 +鲋鮒 2410 fu4 +鲌鮊 2610 bo2ba4 +鲍鮑 2711 bao4 2365 +鲎鱟 9010 hou4 +鲏鮍 2414 pi2 +鲐鮐 2316 tai2 +鲑鮭 2411 gui1xie2 +鲒鮚 2416 jie2 +鲓鮳 2412 kao4 +鲔鮪 2412 wei3 +鲕鮞 2112 er2 +鲖鮦 2712 tong2 +鲗鰂 2210 zei2 +鲘鮜 2216 hou4 +鲙鱠 2813 kuai4 +鲚鱭 2012 ji4 +鲛鮫 2014 jiao3jiao1 shark +鲜鮮 2815 xian1xian3 fresh 1103 +鲝鮺 8010 zha3 +鲞鮝 9010 xiang3 +鲟鱘 2714 xun2 +鲠鯁 2114 geng3 +鲡鱺 2112 li2 +鲢鰱 2413 lian2 +鲣鰹 2711 jian1 +鲤鯉 2611 li3 3666 +鲥鰣 2410 shi2 +鲦鰷 2719 tiao2 +鲧鯀 2219 gun3 +鲨鯊 3910 sha1 +鲩鯇 2311 wan3huan4 +鲪鮶 2716 jun1 +鲫鯽 2712 ji4 +鲬鯒 2712 yong3 +鲭鯖 2512 qing1zheng1 +鲮鯪 2414 ling2 +鲯鯕 2418 qi2 +鲰鯫 2714 zou1 +鲱鯡 2111 fei1 +鲲鯤 2611 kun1 +鲳鯧 2616 chang1 +鲴鯝 2610 gu4 +鲵鯢 2711 ni2 +鲶鯰 2813 nian2 +鲷鯛 2712 diao1 +鲸鯨 2019 jing1 whale 3603 +鲹鰺 2312 shen1 +鲺鯴 2711 shi1 +鲻鯔 2216 zi1 +鲼鱝 2418 fen4 +鲽鰈 2419 die2 +鲾鰏 2116 bi4bi1 +鲿鱨 2913 chang2 +鳀鯷 2618 ti2 +鳁鰮 2611 wen1 +鳂鰃 2613 wei1 +鳃鰓 2613 sai1xi3 +鳄鰐 2612 e4 3975 +鳅鰍 2918 qiu1 loach +鳆鰒 2814 fu4 +鳇鰉 2611 huang2 +鳈鰁 2619 quan2 +鳉鱂 2714 jiang1 +鳊鯿 2312 bian1 +鳋鰠 2713 sao1 +鳌鰲 5810 ao2 3731 +鳍鰭 2416 qi2 fin +鳎鰨 2612 ta3 sole +鳏鰥 2619 guan1 widower +鳐鰩 2217 yao2 +鳑鰟 2012 pang2 +鳒鰜 2813 jian1 +鳓鰳 2412 le4 +鳔鰾 2119 biao4 +鳕鱈 2117 xue3 +鳖鱉 9810 bie1 3729 +鳗鰻 2614 man2 +鳘鰵 8810 min3 +鳙鱅 2012 yong1 +鳚䲁 2410 wei4 +鳛鰼 2716 xi2 +鳜鱖 2118 gui4 +鳝鱔 2816 shan4 +鳞鱗 2915 lin2 3094 +鳟鱒 2814 zun1 +鳠鱯 2414 huo4hu4 +鳡鱤 2313 gan3 +鳢鱧 2511 li3 +鳣鱣 2011 zhan1shan4 +鳤 2817 guan3 +鳥鸟 2732 niao3diao3 u +鳦 2731 yi3yi4 +鳧凫 2721 fu2 +鳨 2432 li4 +鳩鸠 4702 jiu1 +鳪 2702 bu3 +鳫 7122 yan4 +鳬凫 2721 fu2 +鳭 1722 diao1zhao1 +鳮 7742 ji1 +鳯 7721 feng4 +鳰 8702 ru4 +鳱 1742 gan1han4 +鳲鸤 7722 shi1 +鳳凤 7721 feng4 +鳴鸣 6702 ming2 +鳵 1742 bao3 +鳶鸢 4332 yuan1 +鳷 4742 zhi1 +鳸 3022 hu4 +鳹 8722 qin2 +鳺 5782 fu1gui1 +鳻 8722 fen1 +鳼 0742 wen2 +鳽 1742 jian1 +鳾䴓 1722 shi1 +鳿 1712 yu4 +鴀 1792 fou3fou2 +鴁 2782 yao1 +鴂 5782 jue2 +鴃 2538 jue2 +鴄 7772 pi1 +鴅 7742 huan1 +鴆鸩 4702 zhen4 +鴇鸨 2742 bao3 +鴈 7122 yan4 +鴉鸦 1722 ya1ya3 +鴊 1712 zheng4 +鴋 3722 fang1 +鴌 1032 feng4 +鴍 0032 wen2 +鴎 7772 ou1 +鴏 2334 te4 +鴐 4632 jia1 +鴑 4732 nu2 +鴒鸰 8732 ling2 +鴓 3702 mie4 +鴔 2772 fu2 +鴕鸵 2331 tuo2 +鴖 7772 wen2 +鴗 0712 li4 +鴘 2742 bian4 +鴙 8782 zhi4 +鴚 2132 ge1jia1 +鴛鸳 2732 yuan1 +鴜 2232 zi1 +鴝鸲 2762 qu2gou1gou4 +鴞鸮 6722 xiao1 +鴟鸱 7772 chi1zhi1 +鴠 6712 dan4 +鴡 7712 ju1 +鴢 2772 you4 +鴣鸪 4762 gu1 +鴤 2733 zhong1 +鴥 2338 yu4 +鴦鸯 5032 yang1 +鴧 3722 rong4 +鴨鸭 6752 ya1 +鴩 2782 tie3 +鴪 3782 yu4 +鴫 6702 tian2 +鴬 9932 ying1 +鴭 2772 zhui1 +鴮 4722 wu1 +鴯鸸 1722 er2 +鴰鸹 2762 gua1 +鴱 4742 ai4 +鴲 2762 zhi1 +鴳 3742 yan4 +鴴鸻 2722 heng2 +鴵 3712 jiao1 +鴶 4762 ji2 +鴷䴕 1232 lie4 +鴸 2792 zhu1 +鴹 8752 ren2 +鴺 5782 yi2 +鴻鸿 3712 hong2 +鴼 2736 luo4 +鴽 4632 ru2 +鴾 2752 mou2 +鴿鸽 8762 ge1 +鵀 2232 ren4ren2 +鵁䴔 0742 jiao1 +鵂鸺 2722 xiu1 owl +鵃鸼 2742 zhou1 +鵄 1712 zhi1chi1 +鵅 2762 luo4 +鵆 2122 heng2 +鵇 2752 nian3 +鵈 1742 e3 +鵉 0032 luan2 +鵊 4702 jia2 +鵋 1732 ji4 +鵌 2839 yu2tu2 +鵍 3722 huan1 +鵎 2742 tuo3 +鵏 5722 bu1bu3 +鵐鹀 1712 wu2 +鵑鹃 6722 juan1 +鵒鹆 8762 yu4 +鵓鹁 4742 bo2 +鵔 2334 xun4jun4 +鵕 2742 xun4 +鵖 2712 bi4bi1 +鵗 4722 xi1 +鵘 1762 jun4 +鵙 6782 ju2 +鵚 2722 tu2 +鵛 1712 jing1 +鵜鹈 8722 ti2 +鵝鹅 2752 e2 +鵞 2332 e2 +鵟 4132 kuang2 +鵠鹄 2762 hu2gu3 +鵡鹉 1712 wu3 +鵢 2722 shen1 +鵣 5792 lai4chi4 +鵤 2722 zan1 +鵥 9232 pan4 +鵦 2739 lu4 +鵧 8742 ping2bing4 +鵨 8762 shu1 +鵩 7722 fu2 +鵪鹌 4772 an1yan4 +鵫 2742 zhao4 +鵬鹏 7722 peng2 +鵭 8712 qin2 +鵮鹐 2772 qian1 +鵯鹎 2742 bei1 +鵰 7722 diao1 +鵱 4712 lu4 +鵲鹊 4762 que4 +鵳 7722 jian1 +鵴 2792 ju2 +鵵 2722 tu4 +鵶 1712 ya1 +鵷鹓 3722 yuan1 +鵸 4762 qi2 +鵹 2732 li2 +鵺 0722 ye4 +鵻 2031 zhui1 +鵼 3712 kong1 +鵽 7742 duo4 +鵾鹍 6772 kun1 +鵿 2634 sheng1 +鶀 2438 qi2 +鶁 0792 jing1 +鶂 7722 yi4 +鶃 2731 yi4 +鶄䴖 5722 jing1 +鶅 2762 zi1 +鶆 4792 lai2 +鶇鸫 5792 dong1 +鶈 5742 qi1 +鶉鹑 0742 chun2 +鶊鹒 0722 geng1 +鶋 7722 ju1 +鶌 7722 qu1ju1 +鶍 6722 yi4 +鶎 3792 zun1 +鶏 2782 ji1 +鶐 3732 shu4 +鶑 9932 ying1 +鶒 5792 chi4 +鶓鹋 4762 miao2 +鶔 7792 rou2 +鶕 0762 an1ya1 +鶖鹙 2932 qiu1 +鶗 6782 ti2 +鶘鹕 4762 hu2 +鶙 0722 ti2 +鶚鹗 6722 e4 +鶛 2762 jie1 +鶜 4722 mao2 +鶝 1762 fu2 +鶞 7722 chun1 +鶟 3782 tu2 +鶠 7772 yan3 +鶡鹖 6772 he2 +鶢 2742 yuan2 +鶣 3722 pian1 +鶤 3752 yun4kun1 +鶥鹛 7722 mei2 +鶦 4732 hu2 +鶧 4752 ying1 +鶨 2722 dun4 +鶩鹜 1832 wu4 +鶪䴗 6782 ju2 +鶫 5792 dong1 +鶬鸧 8762 cang1 +鶭 2032 fang3 +鶮 0722 gu4 +鶯莺 9932 ying1 +鶰 6782 yuan2 +鶱 3032 xian1 +鶲鹟 8712 weng1 +鶳 2132 shi1 +鶴鹤 4722 he4 crane +鶵 2742 chu2 +鶶 0722 tang2 +鶷 3762 xia4 +鶸 1722 ruo4 +鶹鹠 7762 liu2 +鶺鹡 1722 ji2 +鶻鹘 7722 gu3 +鶼鹣 8732 jian1qian1 +鶽 2742 xun4sun3 +鶾 4842 han4 +鶿鹚 4432 ci2 +鷀鹚 8772 ci2 +鷁鹢 8712 yi4 +鷂鹞 2772 yao4 +鷃 6742 yan4 +鷄鸡 2782 ji1 +鷅 1792 li4 +鷆 2782 tian2 +鷇 4734 kou4 +鷈䴘 2231 ti1 +鷉 7722 ti1 +鷊鹝 1722 ni4yi4 +鷋 4792 tu2 +鷌 2132 ma3 +鷍 3792 jiao1 +鷎 2742 gao1 +鷏 4782 tian2 +鷐 6722 chen2 +鷑 8712 li4 +鷒 5732 zhuan1 +鷓鹧 0722 zhe4 +鷔 5832 ao2 +鷕 6032 yao3wei3 +鷖鹥 7732 yi1 +鷗鸥 7772 ou1 +鷘 5832 chi4 +鷙鸷 4532 zhi4zhe2 +鷚鹨 1722 liao2liu4 +鷛 0722 yong2 +鷜 5742 lou2 +鷝 6742 bi4 +鷞 4782 shuang1 +鷟 0832 zhuo2 +鷠 2732 yu2 +鷡 8732 wu2 +鷢 7122 jue2 +鷣 1742 yin2 +鷤 6752 ti2 +鷥鸶 2232 si1 +鷦鹪 2732 jiao1 +鷧 4712 yi4 +鷨 4752 hua1 +鷩 9732 bi4 +鷪 6632 ying1 +鷫鹔 5722 su4 +鷬 4782 huang2 +鷭 2762 fan2 +鷮 2722 jiao1 +鷯鹩 4792 liao2 +鷰 4432 yan4 +鷱 2742 kao1 +鷲鹫 0332 jiu4 +鷳鹇 7722 xian2 +鷴 7722 xian2 +鷵 7722 tu2 +鷶 6782 mai3 +鷷 8732 zun1 +鷸鹬 1722 yu4shu4 +鷹鹰 0022 ying1 +鷺鹭 6732 lu4 +鷻 2834 tuan2 +鷼 7722 xian2 +鷽鸴 7732 xue2 +鷾 0732 yi4 +鷿䴙 7032 pi4 +鸀 6712 zhu3 +鸁 0021 luo2 +鸂㶉 3712 qi1xi1 +鸃 2835 yi2 +鸄 2832 ji2 +鸅 6742 zhe2 +鸆 2722 yu2 +鸇鹯 0712 zhan1 +鸈 3792 ye4 +鸉 4632 yang2 +鸊 7722 pi4 +鸋 3722 ning2 +鸌鹱 2434 hu4 +鸍 1722 mi2 +鸎 6632 ying1 +鸏鹲 4722 meng2 +鸐 1722 di2 +鸑 4332 yue4 +鸒 7732 yu2yu4 +鸓 6762 lei3 +鸔 2639 bao4 +鸕鸬 2722 lu2 +鸖 1722 he4 +鸗 0132 long2 +鸘鹴 1792 shuang1 +鸙 8722 yue4 +鸚鹦 6742 ying1 +鸛鹳 4722 guan4 +鸜 6722 qu2 +鸝鹂 1722 li2 +鸞鸾 2232 luan2 +鸟鳥 2712 niao3diao3 bird 1325 +鸠鳩 4702 jiu1 3804 +鸡雞 7742 ji1 chicken 1391 +鸢鳶 4312 yuan1 +鸣鳴 6702 ming2 1486 +鸤鳲 7722 shi1 +鸥鷗 7772 ou1 3454 +鸦鴉 7722 ya1 2538 +鸧鶬 8772 cang1 +鸨鴇 2742 bao3 +鸩鴆 4702 zhen4 +鸪鴣 4762 gu1 +鸫鶇 4792 dong1 +鸬鸕 2722 lu2 +鸭鴨 6752 ya1 duck 2460 +鸮鴞 6722 xiao1 +鸯鴦 5012 yang1 3399 +鸰鴒 8732 ling2 +鸱鴟 7772 zhi1 +鸲鴝 2762 qu2 +鸳鴛 2712 yuan1 3354 +鸴鷽 9012 xue2 +鸵鴕 2311 tuo2 ostrich +鸶鷥 2212 si1 heron +鸷鷙 5512 zhi4 +鸸鴯 1722 er2 +鸹鴰 2762 gua1 +鸺鵂 2722 xiu1 +鸻鴴 2722 heng2 +鸼鵃 2742 zhou1 +鸽鴿 8762 ge1 2913 +鸾鸞 0012 luan2 3604 +鸿鴻 3712 hong2 1824 +鹀鵐 1712 wu2 +鹁鵓 4742 bo2 +鹂鸝 1722 li2 +鹃鵑 6722 juan1 3364 +鹄鵠 2762 hu2gu3 +鹅鵝 2752 e2 goose 2663 +鹆鵒 8762 yu4 +鹇鷳 3722 xian2 +鹈鵜 8722 ti2 +鹉鵡 1712 wu3 3812 +鹊鵲 4762 que4 magpie 3408 +鹋鶓 4762 miao2 +鹌鵪 4772 an1yan4 quail +鹍鵾 6772 kun1 +鹎鵯 2742 bei1 +鹏鵬 7722 peng2 1935 +鹐鵮 2772 qian1 +鹑鶉 0742 chun2 quail +鹒鶊 0722 geng1 +鹓鵷 3722 yuan1 +鹔鷫 5722 su4 +鹕鶘 4762 hu2 +鹖鶡 6772 he2 +鹗鶚 6722 e4 +鹘鶻 7722 gu2hu2 +鹙鶖 2912 qiu1 +鹚鶿 8772 ci2 +鹛鶥 7722 mei2 +鹜鶩 1812 mu4 +鹝鷊 1722 yi4 +鹞鷂 2772 yao4 +鹟鶲 8712 weng1 +鹠鶹 7762 liu2 +鹡鶺 3722 ji2 +鹢鷁 8712 yi4 +鹣鶼 8722 jian1 +鹤鶴 4722 he4 1991 +鹥鷖 7712 yi1 +鹦鸚 7742 ying1 3685 +鹧鷓 0722 zhe4 +鹨鷚 1722 liao2 +鹩鷯 4792 liao2 +鹪鷦 2732 jiao1 +鹫鷲 0312 jiu4 +鹬鷸 1722 yu4 +鹭鷺 6712 lu4 3789 +鹮 6772 huan2 +鹯鸇 0712 zhan1 +鹰鷹 0022 ying1 eagle 1857 +鹱鸌 2414 hu4 +鹲鸏 4722 meng2 +鹳鸛 4722 guan4 crane +鹴鸘 1792 shuang1 +鹵卤 2160 lu3 u +鹶 2862 jin1 +鹷 2863 ling2 +鹸 2868 jian3 +鹹咸 2365 xian2 +鹺鹾 2861 cuo2 +鹻 2863 jian3 +鹼硷 2868 jian3 +鹽盐 7810 yan2 +鹾鹺 2861 cuo2 +鹿 0021 lu4 u deer 2269 +麀 0021 you1 +麁 2721 cu1 +麂 0021 ji3 +麃 0023 biao1pao2 +麄 0021 cu1 +麅 0021 pao2 +麆 0021 zhu4 +麇 0029 jun1qun2 +麈 0021 zhu3 +麉 1121 jian1 +麊 9021 mi2 +麋 0029 mi2 +麌 0028 yu3 +麍 0021 liu2 +麎 0023 chen2 +麏 0026 jun1 +麐 0026 lin2 +麑 0021 ni2mi2 +麒 0428 qi2 3496 +麓 4421 lu4 3534 +麔 0026 jiu4 +麕 0026 jun1 +麖 0029 jing1 +麗丽 1121 li4li2 +麘 0026 xiang1 +麙 0025 yan2 +麚 0024 jia1 +麛 0024 mi2 +麜 0029 li4 +麝 0024 she4 +麞 0021 zhang1 +麟 0925 lin2 2434 +麠 0027 jing1 +麡 0022 ji1 +麢 0026 ling2 +麣 0624 yan2 +麤 0021 cu1 +麥麦 4040 mai4 u +麦麥 5040 mai4 1466 +麧 4841 ge1he2 +麨 4942 chao3 +麩麸 4548 fu1 +麪 4142 mian4 +麫 4142 mian4 +麬 4444 fu1 +麭 4741 pao4 +麮 4443 qu4 +麯 4546 qu1 +麰 4345 mou2 +麱 4342 fu1 +麲 4641 xian4 +麳 4449 lai2 +麴 4742 qu2qu1 +麵面 4146 mian4 +麶 4042 chi1 +麷 4541 feng1 +麸麩 4548 fu1 bran +麹 4742 qu2 +麺 4146 mian4 +麻 0029 ma2ma1 u 1042 +麼么 0023 mo5ma5 +麽么 0023 mo5mo3ma5me5 3381 +麾 0021 hui1 +麿 0026 mi2 +黀 0024 zou1 +黁 0026 nen1nun2 +黂 0080 fen2 +黃黄 4480 huang2 u +黄黃 4480 huang2 yellow 494 +黅 4882 jin1 +黆 4481 guang1 +黇 4186 tian1 +黈 4081 tou3 +黉黌 9080 hong2 +黊 4481 xi1 +黋 9421 kuang4 +黌黉 7780 hong2 +黍 2090 shu3 u +黎 2790 li2 1527 +黏 2196 nian2 +黐 2092 chi1 +黑 6033 hei1 u black 446 +黒 6033 hei1 +黓 6334 yi4 +黔 6832 qian2 3422 +黕 6431 dan1dan3 +黖 6131 xi4 +黗 6531 tuan3 +默 6338 mo4 998 +黙 6333 mo4 +黚 6437 qian2 +黛 2333 dai4 2559 +黜 6237 chu4 +黝 6432 you3 3503 +點点 6136 dian3 +黟 6232 yi1 +黠 6436 xia2 +黡黶 7123 yan3 +黢 6334 qu1 +黣 6835 mei3 +黤 6431 yan3 +黥 6039 qing2 +黦 6331 yue4 +黧 2733 li2lai2 +黨党 9033 dang3 +黩黷 6438 du2 +黪黲 6332 can3 +黫 6131 yan3 +黬 6335 an4 +黭 6834 yan3 +黮 6431 dan4shen4 +黯 6036 an4 2865 +黰 6438 zhen3 +黱 7923 dai4 +黲黪 6332 can3 +黳 7733 yi1 +黴 2824 mei2 +黵 6736 dan3 +黶黡 7133 yan3 +黷黩 6438 du2 +黸 6131 lu2 +黹 3222 zhi3 u +黺 3822 fen3 +黻 3324 fu2fu4 +黼 3322 fu3 +黽黾 7771 min3mian3meng3 u +黾黽 6071 min3mian3meng3 +黿鼋 1071 yuan2 +鼀 4071 cu4 +鼁 4071 qu4 +鼂 6071 chao2 +鼃 4071 wa1 +鼄 2571 zhu1 +鼅 8671 zhi1 +鼆 7781 meng3 +鼇 4871 ao2 +鼈 9871 bie1 +鼉鼍 6671 tuo2 +鼊 7071 bi4 +鼋黿 1071 yuan2 +鼌 6071 chao2 +鼍鼉 6671 tuo2 +鼎 2222 ding3 u 2184 +鼏 7722 mi4 +鼐 1722 nai4 +鼑 2122 ding3 +鼒 4022 zi1 +鼓 4414 gu3 u drum 1002 +鼔 4114 gu3 +鼕 4430 dong1 +鼖 4014 fen2 +鼗鞀 3214 tao2 +鼘 4422 yuan1 +鼙 4440 pi2 +鼚 4473 chang1 +鼛 4460 gao1 +鼜 4413 qi4 +鼝 3214 yuan1 +鼞 4410 tang1 +鼟 4410 teng1 +鼠 7771 shu3 u 1795 +鼡 9021 shu3 +鼢 7872 fen2 +鼣 7378 fei4 +鼤 7074 wen2 +鼥 7374 ba2 +鼦 7776 diao1 +鼧 7371 tuo2 +鼨 7773 zhong1 +鼩 7772 qu2 +鼪 7571 sheng1 +鼫 7176 shi2 +鼬 7576 you4 +鼭 7474 shi2 +鼮 7274 ting2 +鼯 7176 wu2 +鼰 7678 nian4 +鼱 7572 jing1 +鼲 7775 hun2 +鼳 7678 ju2 +鼴鼹 7171 yan3 +鼵 7378 tu1 +鼶 7271 si1 +鼷 7278 xi1 +鼸 7873 xian3 +鼹鼴 7674 yan3 +鼺 7676 lei2 +鼻 2622 bi2 u nose 1452 +鼼 2220 yao3 +鼽 2421 qiu2 +鼾 2124 han1 +鼿 2121 wu1 +齀 2121 wu4 +齁 2722 hou1 +齂 2529 xi4 +齃 2622 ge2e4 +齄 2421 zha1 +齅 2628 xiu4 +齆 2221 weng4 +齇 2121 zha1 +齈 2523 nong2 +齉 2523 nang4 +齊齐 0022 qi2 u +齋斋 0022 zhai1 +齌 0022 ji4 +齍 0022 zi1 +齎赍 0022 ji1 +齏齑 0022 ji1 +齐齊 0022 qi2 684 +齑齏 0022 ji1 +齒齿 2177 chi3 u +齓 2271 chen4 +齔龀 2171 chen4 +齕龁 2871 he2 +齖 2174 ya2 +齗龂 2272 yin1 +齘 2872 xie4 +齙龅 2771 pao2 +齚 2871 ze2 +齛 2471 shi4 +齜龇 2271 zi1 +齝 2376 chi1 +齞 2678 yan4 +齟龃 2771 ju3 +齠龆 2776 tiao2 +齡龄 2873 ling2 +齢 2873 ling2 +齣 2772 chu1 +齤 9077 quan2 +齥 2570 xie4 +齦龈 2773 yin2 +齧 5777 nie4 +齨 2777 jiu4 +齩 2074 yao3 +齪龊 2678 chuo4 +齫 2670 kun3 +齬龉 2176 yu3 +齭 2272 chu3 +齮 2472 yi3 +齯 2771 ni2 +齰 2476 ze2 +齱 2774 zou1 +齲龋 2272 qu3 +齳 2775 yun3 +齴 2072 yan3 +齵 2672 ou2yu2 +齶腭 2672 e4 +齷龌 2771 wo4 +齸 2871 yi4 +齹 8077 chuo1 +齺 2772 zou1 +齻 2478 dian1 +齼 2478 chu3 +齽 2479 jin4 +齾 2377 ya4 +齿齒 2177 chi3 tooth 1949 +龀齔 2471 chen4 +龁齕 2871 he2 +龂齗 2272 yin1 +龃齟 2771 ju3 +龄齡 2873 ling2 age 1580 +龅齙 2771 pao2 +龆齠 2776 tiao2 +龇齜 2271 zi1 +龈齦 2773 yin2 +龉齬 2176 yu3 +龊齪 2678 chuo4 +龋齲 2272 qu3 +龌齷 2771 wo4 +龍龙 0121 long2 u +龎厐 7121 pang2 +龏 0144 gong1 +龐庞 0021 pang2 +龑䶮 0880 yan3 +龒 0190 long2 +龓 4121 long2 +龔龚 0180 gong1 +龕龛 8021 kan1 +龖 0121 ta4 +龗 1021 ling2 +龘 0121 ta4 +龙龍 4301 long2 dragon 533 +龚龔 4380 gong1 2647 +龛龕 8041 kan1 +龜龟 2711 gui1jun1qiu1 u +龝 2791 qiu1 +龞 9811 bie1 +龟龜 2771 gui1 tortoise turtle 2614 +龠 8022 yue4 u +龡 8728 chui4 +龢 8229 he2he4huo4 +龣 8729 jue2 +龤 8226 xie2 +龥 8128 yu4 diff --git a/plugin/vimim.txt b/plugin/vimim.txt new file mode 100644 index 00000000..7ad6e982 --- /dev/null +++ b/plugin/vimim.txt @@ -0,0 +1,3523 @@ +o2 氧气 +co2 二氧化碳 +hwsor 硫酸 SULFURICACID + +east 东 东方 +west 西 西方 +south 南 南方 +north 北 北方 + +spring 春 春天 喷泉 弹簧 +summer 夏 夏天 +autumn 秋 秋天 +winter 冬 冬天 寒冬 + +sunday 星期日 礼拜天 +monday 星期一 礼拜一 +tuesday 星期二 礼拜二 +wednesday 星期三 礼拜三 +thursday 星期四 礼拜四 +friday 星期五 礼拜五 +saturday 星期六 礼拜六 +week 星期 礼拜 +weekend 周末 + +january 一月 +february 二月 +march 三月 游行 行军 步伐 +april 四月 +may 五月 也许 可以 +june 六月 +july 七月 +august 八月 +september 九月 +october 十月 +november 十一月 +december 十二月 + +first 第一 首先 第一次 最初 先 +second 第二 秒 秒钟 +third 第三 +fourth 第四 +fifth 第五 +sixth 第六 +seventh 第七 +eighth 第八 +ninth 第九 +tenth 第十 +zero 零 零度 零点 +one 一 壹 一个 +two 二 贰 二个 两个 俩个 +three 三 叁 +four 四 肆 +five 五 伍 +six 六 陆 +seven 七 柒 +eight 八 捌 +nine 九 玖 +ten 十 拾 +eleven 十一 +twelve 十二 +numbers 一二三四五六七八九十 壹贰叁肆伍陆柒捌玖拾 + +tulip 郁金香 +poppy 罂粟花 +jasmine 茉莉花 +rose 玫瑰花 +camellia 山茶花 +hawthorn 山楂花 +vanilla 香子兰 香草 + +ferrari 法拉利 +lamborghini 兰博基尼 +chrysler 克莱斯勒 +volkswagen 大众汽车 + +canton 广州 +hongkong 香港 +macau 澳门 +losangeles 洛杉矶 +turandot 图兰朵 +austin 奥斯汀 +australia 澳大利亚 澳洲 +austria 奥地利 +baghdad 巴格达 +belgium 比利时 +california 加利福尼亚 +vietnam 越南 +vietnamese 越南语 越南人 +virginia 弗吉尼亚 + +color 颜色 彩色 色 +red 红色 红 朱 赤 +black 黑色 黑 +yellow 黄色 黄 +green 绿色 绿 +blue 蓝色 蓝 +violet 紫色 +purple 紫色 紫 +white 白色 白 +grey 灰色 灰 +pink 粉红 桃色 +golden 金色 金色的 + +gb 国标 国标码 +big5 大五码 +mlck 目录词库 +wjck 文件词库 +mjck 民间词库 +znbq 智能补全 +cjjp 超级简拼 首拼 + +ability 才能 能力 +able 能力 +aboard 在船上 +about 关于 前后 大约 +above 上面 以上 +abroad 国外 +abscess 脓肿 溃疡 +absence 缺席 不在 +absolute 绝对 +abstract 摘要 抽象 +absurd 荒唐 不经之谈 +abyss 深渊 +accelerator 油门 +accent 口音 重音 腔调 +accept 答应 接受 +accident 意外 事故 +accord 调和 一致 +account 账号 账目 +accrue 累积 +accumulate 积累 累加 +accuracy 准确性 精确程度 +accurate 精确的 准确的 正确无误的 +acquire 获得 +across 走过 越过 +act 动作 扮演 +action 举动 作用 行为 动作 +activate 激活 +ad 广告 +add 加 加上 加入 附加 添加 +addition 加法 附加 +address 住址 地址 攀谈 致敬 +adjust 调整 +admire 欣赏 赞叹 +admission 许可 +admit 入场 +advance 先进 高级 +advantage 优势 优点 利益 +adventure 奇遇 +adverb 副词 +advertisement 广告 +advice 劝导 忠告 意见 +advise 通告 +advocacy 拥护 支持 提倡 出庭辩护 +affair 风流 风流韵事 +affiliate 互联网营销模式 分销联盟 +afghanistan 阿富汗 +afraid 害怕 恐怕 担忧 +africa 非洲 +before 以前 以往 从前 曾经 早先 先头 +after 以后 +afternoon 下午 +again 又 再次 重新 再三 +against 抵抗 +age 年龄 骨龄 时代 +ago 以前 +agree 一致 同意 承认 赞成 +agreement 一致 合同 +agriculture 农 农业 +aids 艾滋病 +air 空气 +airplane 飞机 +airport 飞机场 +alabama 阿拉巴马 +alarm 警报 +alaska 阿拉斯加 +alcohol 酒精 酒 +algebra 代数学 +algorithm 算法 +alike 相似 +alive 活着 活泼 +all 都 都是 一切 全体 全部 所有 +allow 承认 容许 +almost 几乎 差不多 +alone 独 单独 独自 +along 沿着 +alpha α Α +alphabet 字母 +already 已经 +although 虽然 纵然 即使 +alumina 铝 +alumni 校友 +always 总是 一直 时刻 历来 老是 向来 从来 素来 +ambiguity 暧昧 歧义 模棱两可 +ambiguous 暧昧的 +amidst 当中 +ammo 弹药 军火 +among 之中 +amount 总计 +amour 恋情 私通 偷情 性爱 +broadvision 宏道资讯 +greencard 绿卡 +backspace 退格键 +space 空白 空间 空格键 +menu 菜单 +menuless 无菜单 +target 目标 靶子 靶标 对准 枪靶 意图 +quota 配额 限额 定额 指标 +goal 球门 终点 目的 目标 +sake 理由 缘故 +aim 瞄准 +purpose 目的 企图 +zen 禅 +candidate 候选人 +refresh 刷新 提神 +setup 设置 配置 +mobile 移动 流动 手机 +cellphone 手机 +amplitude 幅度 +amuse 欢喜 高兴 +amusement 娱乐 消遣 +analog 模拟 +analysis 分析 +analyze 分析 +ancestor 祖先 +anchor 锚 +ancient 古代 +and 和 +andorra 安道尔 +bill 比尔 帐单 +mike 麦克 麦克风 话筒 +david 大为 大卫 +angie 安琪 +angel 天使 安琪儿 +angle 角 +angry 生气 愤怒 +animal 动物 禽兽 畜生 +announcement 宣布 宣告 布告 广播 通知 +another 另一个 +answer 回答 答案 答覆 +ant 蚂蚁 +antonym 反义词 +anxious 忧虑 渴望 +any 任何 任一 +anyhow 反正 +anyone 任何人 +apartment 公寓 +apostrophe 撇号 +apparent 显然 +appear 显露 现出 显得 好像 +appendix 附录 +apple 苹果 +application 应用 +apply 申请 +appoint 指定 +appointment 约会 任命 +approah 接近 趋近 +approximate 近似 +apricot 杏 +apt 善于 适当 +arab 阿拉伯 阿拉伯人 阿拉伯马 +arch 弧 拱 弓形 +archimedes 阿基米德 +are 是 +areca 槟榔 +argentina 阿根廷 +argon 氩 +arigato 谢谢 +arise 兴起 出现 起来 +arithmetic 算术 运算 +arizona 亚利桑那 +arkansas 阿肯色 +arm 臂 +armenia 亚美尼亚 +armour 装甲 盔甲 +army 军 军队 陆军 +around 周围 +arrange 安排 布置 +array 阵列 +arrest 逮捕 +arrive 到达 +arrow 矛 箭 → ↑ ← ↓ ↖ ↗ ↘ ↙ +arsenic 砷 +art 艺术 +arthritis 关节炎 +article 文章 论文 条款 +artificial 人造 +artist 美术家 艺术家 +artistry 艺术性 技艺 +as 作为 +asap 尽快 尽早 尽可能快 尽可能早 +ascend 上升 +ashame 羞耻 惭愧 +asia 亚洲 亚细亚 +aside 旁边 +ask 询问 +asleep 睡熟 +asparagus 芦笋 +assembly 流水线 生产线 +assist 助手 补助 +assistant 助手 +associate 联想 +assume 假设 假定 承担 设想 臆断 臆测 意想 +astound 惊愕 +astray 走错 +at 在 +athlete 体育 运动 +atlanta 亚特兰大 +atlantic 大西洋 +atlast 终于 +atleast 至少 +atmost 至多 +atom 原子 +atropine 阿托品 +attach 贴上 依恋 附加 +attack 攻击 +attempt 企图 试图 +attend 出席 +attention 注意 留心 +attitude 姿态 +attribute 属性 +audacity 大胆 厚颜 +audience 听众 读者 +audio 音频 伴音 +augment 增加 增强 +aunt 阿姨 舅母 +austerity 节俭 严峻 严厉 苦行 +author 笔者 作者 当局 权威 +auto 自动 +average 平均 +avoid 避免 +aware 意识到 +away 离开 +awful 厉害 可怕 +axe 斧 +axis 轴 +baby 娃 娃娃 宝宝 婴儿 宝贝 孩子 孩儿 稚子 +bachelor 学士 +back 回 退 背 +backfire 帮倒忙 弄巧成拙 适得其反 事与愿违 +background 背景 +backslash 反斜杠 +backward 落后 +bad 坏 +bag 袋 +baggage 行李 +bake 烘烤 +balance 平衡 差额 天平 +balcony 阳台 戏院 +bald 秃 +ball 球 +balloon 气球 气圈 +bamboo 竹 竹笋 +banana 香蕉 +band 乐队 +bangladesh 孟加拉国 +bank 银行 河岸 +banquet 宴会 +barber 理发师 +bargain 廉价品 +bark 树皮 +barn 谷仓 +base 基础 库 +baseball 垒球 +basic 基本 +basil 紫苏 罗勒 九层塔 金不换 +basket 篮子 笼篓 +basketball 篮球 +bat 棍子 球棒 +bath 洗澡 +bathroom 浴室 +battery 电池 +battle 战斗 战役 +bay 湾 +bazaar 市场 市集 +beach 海滩 海滨 +beam 光线 发光 射线 横粱 +bean 豆 +bear 熊 熊市 +beard 胡子 +beast 兽 +beat 打败 +beautiful 美丽的 漂亮的 +beauty 美丽 漂亮 +because 因为 由于 +become 变成 +bed 床 +bedroom 寝室 卧室 +bee 蜜蜂 +beef 牛肉 +beer 啤酒 +beg 乞讨 +begin 开始 着手 +beginner 初学者 +behind 后面 +belief 信仰 信用 信心 +believe 相信 以为 +bell 钟 铃 +belly 腹 +belong 属 属于 附属 +belt 腰带 +bench 长凳 +bend 弯曲 +beneath 下面 +benefit 利益 好处 +benin 贝宁 +berkeley 伯克利 +berlin 柏林 +berlinwall 柏林墙 +berry 浆果 +beside 另外 此外 旁边 +best 最好的 最好 +bet 赌 +beta β Β +better 更好 较好 越来越好 +between 之间 +beyond 超过 那边 +bhutan 不丹 +bible 圣经 +bicycle 自行车 单车 +big 大 +bigger 越来越大 +biggest 最大的 +bikini 比基尼 三点式 +bind 装钉 捆 +biography 传 +bird 鸟 +birth 诞生 +birthday 生日 +biscuit 饼干 +bit 少许 一点 +bite 咬 比特 +bitter 苦的 辛苦 +blackberry 黑莓 黑莓子 +blackboard 黑板 +blackbox 黑箱 +blackjack 廿一点 +blade 刃 刀片 +blame 责备 责怪 非难 +blank 空白 +blanket 毯子 毡子 +blast 爆炸 阵风 +blaze 冒火 火焰 +bless 幸福 祝福 +blind 盲 瞎 +blink 闪烁 +blog 博客 微博 发微博 织围脖 +blood 血 血腥 +bloody 残忍 +blossom 开花 +blot 污斑 吸掉 +blow 吹 +blowjob 吹萧 打飞机 +blush 面红 惭愧 +board 木板 船内 +boast 夸耀 自夸 +boat 船 小船 小艇 +body 体 身体 团体 +boil 煮 沸腾 +boiler 锅炉 汽锅 +bold 大胆 +bolivia 玻利维亚 +bomb 炸弹 轰炸 +bond 债卷 +bone 骨 骨头 +bonus 奖金 +book 书 书籍 书本 登记 预订 +bookcase 书橱 +boots 长靴 +born 出生 出身 +boron 硼 +borrow 借 +bosnia 波斯尼亚 +bosom 胸膛 +boss 老板 +botany 植物学 +both 两者 两个 双方 +botox 保妥适 肉毒杆菌素 +bottom 底下部 +bound 界限 跳跃 +bounty 赏金 +bow 点头 船首 +box 盒 +boy 少年 男孩 +boyfriend 男友 男朋友 +bra 文胸 胸罩 +bracket 括号 支架 托架 +brain 脑 头脑 脑袋 脑髓 +brainwash 洗脑 +branch 支流 树枝 +brave 勇敢 +brazil 巴西 +bread 面包 +breadth 幅员 广阔 +break 弄坏 破裂 +breakfast 早餐 +breast 乳房 胸部 奶 乳 +breath 呼吸 气息 +breeze 和风 微风 +bribe 行贿 收买 买通 打点 贿络 买关节 +brick 砖 砖头 砖块 金砖四国 +bridge 桥 桥梁 +brief 简短 扼要 概略 +bright 光亮 灿烂 辉煌 +brilliant 辉煌 华丽 +bring 带来 拿来 +britain 不列颠 英国 英国人 +broad 广大 广阔 明朗 +broadcast 广播 +broken 破碎 断续 +bromine 溴 +brook 溪流 +broom 扫帚 +brother 老兄 哥哥 兄弟 +brow 眉毛 额头 +brown 布朗 褐色 +browse 浏览 +browser 浏览器 浏览者 +brunei 文莱 +brush 刷子 毛刷 +brute 粗暴 畜牲 野兽 +bslash 反斜杠 +btw 顺便说一句 +bucket 桶 水桶 吊桶 +bud 花蕾 叶芽 +buffer 缓冲 +bug 臭虫 +bugle 喇叭 +build 建设 建造 +building 建筑物 大厦 +bull 牛 牛市 +bullet 枪弹 +bullying 霸凌 +bunch 串 束 +burden 负担 重担 +burn 燃烧 烧 +burst 爆发 破裂 +bury 埋葬 +bus 汽车 公共汽车 +bush 丛林 树丛 +business 事务 营业 +busy 忙碌 匆忙 +but 但是 不过 可是 +butterfly 蝴蝶 +button 钮扣 +buy 买 +buzz 嗡嗡 +byebye 再见 再会 告别 拜拜 +cabbage 洋白菜 高丽菜 +cabin 小屋 +cabine 内阁 柜橱 +cable 电报 电缆 锚链 +cache 缓存 贮藏所 隐藏处 缓冲贮存区 +cadaver 尸体 死尸 +cafe 小吃 餐馆 +cafeteria 餐馆 +cake 糕 饼 +calcium 钙 +calculator 计算器 +calendar 日历 +call 叫 呼唤 访问 号召 +calm 冷静 平静 沉着 镇定 +cambodia 柬埔寨 +camel 骆 骆驼 +camera 照相机 暗箱 +cameroon 喀麦隆 +camping 露营 +campus 校园 +can 会 能够 可以 +canada 加拿大 +canal 运河 沟渠 +cancel 癌 取消 癌症 +cancer 癌症 取消 +candle 蜡 烛 蜡烛 +candor 直率 爽快 +cannon 大炮 炮 +cannot 不能 +cantonese 粤語 +canvas 画布 帆布 +cap 帽子 +capable 有能力 +capacitance 电容 +capacity 容量 +cape 海角 披肩 +capital 大写 资本 首都 +capitalism 资本主义 +capitalist 资本家 +cappuccino 卡布基诺 +captain 队长 上校 +captive 俘虏 +capture 捕获 掳掠 +car 汽车 车子 +carbon 碳 +card 名片 卡片 贺卡 +care 小心 当心 挂念 照料 +career 职业 职场 职场生涯 +careful 仔细 小心 慎重 谨慎 +careless 粗心 +carpet 地毯 +carriage 客车厢 +carry 带走 搬运 +carve 雕刻 +case 场合 情况 +cash 现金 +casino 赌场 赌博 中奖啦 +cast 铸造 +castle 城堡 +cat 猫 猫腻 +catch 捉 感染 +catdog 猫猫狗狗一家亲 +cattle 家畜 +caucasian 白种人 高加索人 +cause 原因 +cave 山洞 +caveat 警告 中止诉讼手续 +ccp 中国共产党 +cctv 央视 中央电视台 +ceiling 天花板 +celebrate 举行 庆祝 +cell 单元 细胞 蜂窝 +cellar 地下室 地窖 +center 中心 中枢 +central 中央 +centrifuge 离心机 离心分离机 +century 世纪 +ceremony 仪式 典礼 +certain 当然 的确 确实 +certificate 鉴定 证明书 +certify 鉴定 +chad 乍得 +chain 链子 连锁 +chair 椅子 +chairman 主席 +chalk 粉笔 +chamber 会议室 房间 +champion 冠军 优胜者 +chance 机会 偶然 +chanel 香奈尔 +change 变化 改变 +channel 通道 海峡 航道 +chaos 混乱 混沌 凌乱 +chapel 礼拜堂 +chapter 章 +character 人物 角色 字符 +charge 充电 收费 +charm 迷住 魅力 +chase 追逐 追击 +chat 聊天 闲谈 +cheap 便宜 +cheat 欺骗 作弊 骗取 欺诈 行骗 蒙骗 哄骗 作假 欺蒙 欺哄 蒙哄 +cheater 骗子 +check 检查 检验 支票 查一查 把脉 +cheek 腮帮子 +cheer 喝采 欢呼 高兴 +cheerful 快活 +cheese 乳酪 干酪 +chemist 化学 化学家 +cherry 樱桃 +chest 胸 柜 +chestnut 栗子 +chicago 芝加哥 +chicken 鸡 鸡肉 +chief 首席 长官 领袖 头子 督办 +child 儿童 孩子 +chile 智利 +chimney 囱 烟囱 +chimpanzee 黑猩猩 +chin 下巴 下腭 颏 +china 中国 天朝 吃拿 +chinese 汉字 中文 汉语 中国人 +chip 芯片 +chlorine 氯 +choice 选择 选项 +choke 窒息 塞住 +cholesterol 胆固醇 +choose 挑选 选择 +chop 切细 排骨 +christ 基督 +christmas 圣诞节 +church 教堂 +cigar 雪茄 雪茄烟 +cigarette 香烟 +circle 圆 循环 +circuit 电路 线路 +citizen 市民 +city 城市 都市 城 市 +civil 国内 市民 +civilization 文明 +claim 号称 主张 +clarkson 克拉克森大学 +class 阶级 年级 +classic 经典 古典 +classmate 同学 +classroom 教室 +clause 从句 短句 +claw 爪 +clay 泥土 粘土 +clean 干净 清洁 整洁 +cleaning 扫除 +clear 清楚 澄清 +clearly 显然 明明 +clerk 书记 店员 +clever 聪明 伶俐 巧妙 机敏 灵巧 +client 客户 顾客 前端 客户端 +cliff 断崖 绝壁 +climate 气候 水土 +climax 性高潮 +climb 爬 攀登 +climber 登山者 +cling 粘住 固守 +clipboard 剪贴板 +clitoris 阴蒂 +close 关 关闭 接近 +cloth 衣服 衣裳 +cloud 云 云输入 +cloudy 阴天 +clown 小丑 +club 俱乐部 +cmdline 命令行 +coach 教练 指导 +coal 煤 +coat 上衣 +cock 雄鸡 +cocoon 茧 +code 密码 程式 +coding 编程 +coercion 强迫 压迫 控制 制止 +coffee 咖啡 +cognize 认识 +coil 卷线 +cold 冷 凉 伤风 感冒 寒冷 +coldwar 冷战 +collapse 崩溃 +collar 衣领 +colleague 同事 +collect 收集 +college 学院 +collide 碰撞 相撞 相碰 冲撞 +colombia 哥伦比亚 +colony 殖民地 +semicolon 分号 +colorado 科罗拉多 +columbia 哥伦比亚 +column 列 +comb 梳 鸡冠 +combine 组合 结合 联合 +come 来 +comfortable 舒适 安慰 安乐 +comma 逗号 逗点 +command 指挥 命令 +comment 【评论】 评论 +commercial 商业 通商 +commit 为作 委员 +common 公共 共同 普通 +communication 通讯 +communist 共产主义 共产党 +company 公司 伴侣 伙伴 +compare 比较 对照 +compass 指南针 罗盘 圆规 +compatible 兼容 +compete 竞争 竞赛 +competition 比赛 +competitor 竞争者 +compile 编辑 编译 +compiler 编译器 +complain 埋怨 牢骚 诉苦 +complex 复杂 错综复杂 +compliment 恭贺 贺词 赞词 +component 元件 +compose 作文 作曲 +compress 压缩 压紧 +compute 计算 +computer 电脑 计算机 +comrade 同志 战友 +concept 概念 +concern 音乐会 +conclusion 结论 +concord 和谐 +concubine 妾 +condense 凝结 +condition 条件 状态 +condom 安全套 避孕套 +conference 会议 +confine 监禁 限制 +confirm 确认 +conflict 冲突 矛盾 +confucious 孔夫子 +confuse 混淆 +congratulation 祝贺 +conjuncture 结合 连接词 +connect 接合 联络 +connecticut 康涅狄格 +conquer 征服 获得 +consent 同意 答应 +consider 考虑 认为 +consonant 辅音 +constant 恒定 +constitution 宪法 +construction 建造 构造 +consult 商量 请教 +contagious 传染 +contain 包含 含有 容纳 +content 内容 满足 +continent 大陆 +continue 连续 +contour 轮廓 +contradict 矛盾 +contrast 相反 反对 +contribution 贡献 +control 控制 +convenience 方便 适宜 便利 +convenient 方便的 省事的 便利的 +conversation 会话 +convert 变换 转换 +convex 凸 +cook 厨师 烹调 +cool 酷 冷静 +coolie 苦力 +cooperation 协作 合作 +copper 铜 铜币 +copulate 交媾 性交 +copy 复制 拷贝 副本 抄件 +copycat 山寨 复印机 +copypaste 复制粘贴 +copyright 版权 +cord 电线 绳子 +core 核心 磁心 铁心 果心 型心 +cork 软木 +corn 玉米 谷类 +cornell 康奈尔大学 +corner 角落 拐角 旮旯 +corpus 文集 尸体 本金 +correct 正确 合适 改正 纠正 +correspond 对应 相应 +cosmetic 化妆品 美容的 +cost 代价 成本 +costly 昂贵 +cot 婴儿床 娃娃床 +cottage 别墅 +cottage 茅屋 茅舍 别墅 +cotton 棉花 绵 +couch 睡椅 +cough 咳嗽 +council 会议 +counsel 劝告 商量 忠告 +count 计数 计算 +counter 柜台 计算器 +country 国 国家 乡村 农村 +couple 配偶 伴侣 夫妻 +couplet 对联 +courage 勇敢 勇气 +courier 信使 +course 方向 课程 过程 +court 朝廷 法庭 院子 +cousin 堂兄 +cover 封面 覆盖 遮盖 +cow 乳牛 母牛 奶牛 不法奶牛 牛气冲天 +coward 懦夫 胆小鬼 +cowboy 牛郎 牧童 +crab 螃蟹 大闸蟹 +crack 敲破 爆裂 +cracker 爆竹 饼干 +crane 鹳 鶴 +crash 碎掉 +crayon 腊笔 色笔 +create 创造 创建 建立 +credit 信用 信誉 信用卡 +crew 船员 +crime 犯罪 罪恶 +crisis 危机 恐慌 +critic 临界 危急 批评 +croatia 克罗地亚 +crock 缶 罐 +crook 弯曲 +crop 农作物 收成 +cross 十字 交叉 越过 +crowd 一群 拥挤 群众 +crown 王冠 +cruel 残酷 +cruise 巡洋舰 +crusade 十字军东征 +crush 压坏 压碎 +cry 哭 喊 +crystal 水晶 结晶 +cuba 古巴 +cube 立方 +cucumber 黄瓜 +cultivate 培养 栽培 耕作 +culture 文化 +cunning 狡猾 诡诈 +cup 茶杯 奖杯 盃 杯 +cure 医治 治疗 +curious 好奇 好奇心 +curl 卷发 卷毛 +current 当前 现时 通用 通货 货币 流通 +curry 咖喱 +cursor 光标 游标 +curtain 窗帘 +curve 弯曲 曲线 +cushion 垫 垫子 +custom 海关 关税 习惯 风俗 惯例 +customer 顾客 主顾 +cut 切 割 +cycle 循环 周期 +dad 爸爸 父亲 +daily 日报 每天 +daisy 雏菊 +damage 损坏 +damp 湿气 潮湿 +dance 舞 舞会 跳舞 +danger 危险 +dare 敢 胆敢 +dark 黑暗 +darling 爱人 心爱 +dart 投掷 标枪 突进 +darwin 达尔文 +dash 猛冲 +data 数据 +database 数据库 数据仓库 +date 日期 +daughter 女儿 +dawn 天亮 曙光 黎明 +daytime 昼 日间 白天 +dead 死 枯死 +deaf 聋 +deal 交易 +dealer 商人 +dear 亲爱 宝贵 +death 死亡 +debt 借款 债务 恩义 +decide 决定 +decision 决心 +deck 甲板 +declare 宣言 声明 +decrease 减少 +deed 行为 +deep 深 +deer 鹿 +default 缺省 默认 +defeat 击破 打败 挫败 +defence 防守 +defend 防御 保护 辩护 +define 定义 +definition 定义 +degree 学位 度 度数 程度 ℃ +delaware 特拉华 +delegate 代表 +delete 删除 删掉 砍掉 +delight 欢喜 +delta δ Δ +demand 需要 要求 +demeanor 风度 +demero 杜冷丁 +demo 演示 +denmark 丹麦 +department 部门 +depend 依赖 信任 +depth 深度 +dermatology 皮肤科 +descent 降下 下来 +describe 叙述 说明 陈述 +desert 沙漠 +design 设计 图样 企图 +desire 愿望 +desk 书桌 写字台 +despair 绝望 断念 +destroy 破坏 灭亡 +detail 细节 详细 详尽 +detention 留校 拘留 扣押 监禁 留堂 +determine 决定 判断 确定 +develop 发展 发达 显像 +device 设备 +devil 魔鬼 恶魔 +dew 露水 +dialog 对话 +diamond 钻石 +diary 日记 日志 记事簿 +dictate 听写 口述 +dictionary 字典 词典 辞典 +die 逝世 亡 丧 +diet 饮食 减肥 +difference 不同 区别 差异 差别 +different 不同的 +difficult 困难 难点 +dig 挖掘 挖 掘 +digit 数 数字 数码 +dilemma 进退两难 窘境 困境 +diligence 勤勉 用功 +diligent 勤奋 +dinner 晚饭 晚餐 正餐 +dip 浸一下 泡渍 +dir 目录 +direct 直接 指导 +direction 方向 +directory 目录 +dirt 污泥 污物 +dirty 脏 肮脏 下流 +disable 残废 无能 +disappear 消失 +disaster 灾难 +disc 磁盘 +discharge 卸 +disclaimer 免责声明 +discover 发现 查出 检测 暴露 +discuss 讨论 辩论 商量 +disease 疾病 +dish 碟子 +dislike 嫌弃 嫌恶 反感 +disney 迪士尼乐园 +disorder 杂乱 +display 显示 +dissolve 溶解 +distance 距离 远方 远隔 +distinct 区别 +district 地区 +disturb 扰乱 骚扰 妨碍 +dive 跳水 潜水 +divide 划分 隔开 +divorce 离婚 分离 +djibouti 吉布提 +dna 脱氧核糖核酸 +do 作 做 干 搞 +dock 造船厂 船坞 +doctor 博士 医生 +dog 狗 犬 +dog101 一零一忠狗 +dollar 美圆 美元 $ +dominica 多米尼加 +dominican 多米尼加 +domino 多米诺骨牌 多米诺效应 +donkey 驴 驴子 +door 门 大门 +dose 剂 +dot 句号 点 +dots 点横竖撇捺 点横竖撇折 +double 倍 +doubt 怀疑 犯疑 +doubtful 可疑的 +dove 鸽子 +down 下 向下 +download 下载 +downstair 楼下 +dozen 一打 +drag 拖 牵 +dragon 龙 +drain 枯干 +drama 剧本 戏剧 +drawer 屉 +dread 害怕 恐怖 +dreadful 可怕 讨厌 +dream 梦 梦想 神女生涯原是梦 +dress 衣服 +drill 训练 钻孔机 +drink 饮料 喝 饮 +drive 驾驶 驱逐 +driver 司机 +drop 滴 水滴 滴下 +drug 药品 +drum 鼓 +drunkard 酒鬼 +dry 干燥 +duck 鸭 +due 到期 应付 正当 +duly 及时 正好 适当 +dumb 哑 +dummy 傻瓜 +dumpling 饺子 锅贴 +dupe 易受愚弄的人 欺骗 愚弄 +durex 杜蕾斯 安全套 +dust 灰 尘 尘土 尘埃 灰尘 +duty 义务 关税 职务 +dwarf 侏儒 矮子 +dynamic 动态 動態 +each 各自 每个 +eager 渴望 热心 +eagle 鹰 +ear 耳朵 +early 早 +earn 赚得 +earnest 正经 热心 +earth 地球 土地 大地 +earthquake 地震 +easy 容易 +eat 吃食 吃 喫 +echo 共鸣 反响 回声 +edge 刀口 边缘 +edit 编辑 +editor 编辑器 文本编辑器 +edu 教育 教学 +education 教育 教学 +effect 效应 效果 有效 +efficiency 效率 +effort 努力 尽力 +eg 例如 +egg 蛋 鸡蛋 彩蛋 王八蛋 网八蛋 +egypt 埃及 +einstein 爱因斯坦 +election 选举 +electricity 电 +electron 电子 +element 成分 元素 要素 +elephant 象 +elevator 电梯 +eliminate 免除 省去 免除 +ellipse 椭 +else 另 此外 +elsewhere 在别处 +email 电邮 电子邮件 电子邮箱 +embassy 大使馆 +embed 内嵌 镶嵌 +embedded 嵌入式 +emerge 出现 +emperor 皇帝 +empire 帝国 +employ 雇用 使用 +empty 空 空虚 +enable 能够 +encoding 编码 +end 结束 +endure 忍耐 持久 +enemy 敌人 仇敌 +energy 能量 能源 +engage 订婚 约会 约束 婚约 +engine 引擎 发动机 火车头 +engineer 工程师 技师 +england 英国 +english 英文 英语 英国 +enjoy 欣赏 享受 享有 享用 +enough 充足 足够 +enter 回车 进入 +enterprise 企业 +entertain 享乐 娱乐 +entire 全部 完全 全体 +entrance 入场 进口 +env 环境 +envelope 信封 包络 +environment 环境 +envy 妒忌 羡慕 +eq 情商 +equal 等于 相等 公平 +era 时代 +erase 擦掉 删掉 抹除 +eraser 橡皮 +errand 差使 +error 错 错误 过失 +escape 逃避 逸出 +escrow 第三方担保 附带条件委付盖印契约 +especial 特别 尤其 +esteem 尊重 +estimate 估计 估价 +estonia 爱沙尼亚 +etc 等等 +ethiopia 埃塞俄比亚 +etymology 词源 语源 +eu 欧共体 +europe 欧洲 +euthoria 亢奋 极度愉快 极度兴奋 +evaluate 估计 评价 +eve 夕 暮 +even 即使 甚至 +evening 晚上好 傍晚 黄昏 +event 事件 大事 +every 每个 +everybody 每个人 +everything 所有 全体 凡是 +everywhere 到处 哪儿都 +evidence 证据 +evil 恶 祸害 弊病 邪恶 +exact 精确 正确 +exactly 正好 +examine 测验 调查 +example 例如 例子 +exceed 胜过 超过 +excel 胜过 +excellent 佳 优秀 卓越 +except 除了 之外 例外 +excess 过剩 超过 +exchange 兑换 交换 交易所 +excite 刺激 激动 +exclamation 感叹号 +excursion 旅行 远足 +excuse 原谅 辩解 道歉 挡箭牌 +execute 执行 +exercise 练习 锻炼 运动 +exhaust 竭尽 耗尽 +exhibit 展览 陈列 +exist 存在 +expand 扩展 +expect 期望 预期 希望 期待 预料 想到 期盼 料到 +expense 损失 费用 +expensive 贵 +experience 经验 +experiment 实验 +expert 专家 +explain 解释 +explore 探索 查勘 +express 快车 表现 表达 +extend 延伸 扩充 +extenuating 情有可原 +extinguish 灭 +extra 特别 额外 号外 +eye 眼 眼睛 +eyelid 睑 +fable 寓言 谎言 +face 脸 面孔 +fact 事实 +factory 厂 工厂 制造厂 +fade 淡薄 褪色 衰老 +failure 失败 缺少 破产 +fair 博览会 美丽 洁白 +fairy 仙女 妖精 +fall 瀑布 倒塌 掉下 跌到 跌落 秋 坠 +false 假 虚假 虚伪 伪造的 +familiar 熟悉 亲密 +family 家庭 家眷 家族 +famous 著名 有名 +fan 扇子 +fans 粉丝 +far 遥远 迢迢 +fare 车费 +farm 农场 田地 +farmer 农夫 农民 农场主 +farther 更远 远一点 +fast 迅速 结实 牢固 快 捷 +fasten 绑 绑札 +fat 肥 肥胖 减肥 脂肪 +fatal 致命 +fatchoy 发财 +fate 命运 宿命 +father 父亲 爸爸 +fault 缺点 过失 +fax 传真 +fear 害怕 担心 +fearful 恐慌性 +feather 羽毛 +feature 功能 +fee 费 +feeble 虚弱 +feed 喂养 +feedback 反馈 回馈 +feel 感觉 摸索 +feeling 情绪 +feet 英尺 +fellow 伙伴 家伙 +female 女 雌 +festival 节日 +fetch 拿取 +fetish 恋物癖 +fever 发热 发烧 +few 少量 少许 一点 +fiddle 小提琴 拨弄 摆弄 +field 田野 旷野 +fierce 凶 猛烈 凶猛 +fight 打架 战斗 奋斗 数字 图形 +fiji 斐济 +file 文件 文本文件 +fill 填充 充满 +filter 过滤 过滤器 +fin 鱼翅 鱼鳍 +final 最后 +finally 终于 +finance 金融 +find 找 发现 找到 发觉 寻找 +fine 美好 优良 细 +finger 手指 +finish 结束 终结 完成 做完 +finland 芬兰 +fire 火 火灾 +firefox 火狐 +fireman 消防员 +firewall 防火墙 +firm 坚固 商行 +firmware 固件 +firsttime 第一次 +fish 鱼 钓鱼 +fist 拳头 +fit 适当 适合 +fix 固定 安装 +flack 高射炮 严厉批评 宣传员 +flag 旗帜 标识 +flame 火苗 火焰 炽 +flash 闪光 瞬间 +flat 平地 扁平 +flattery 阿谀 谄媚 +flesh 肌肉 +flexible 灵活 +flirt 调情 挑逗 吊膀子 眉来眼去 玩弄 +float 浮起 漂浮 +flood 洪水 大量 +floor 地板 层 +florida 佛罗里达 +flour 面 面粉 +flow 流 流动 +flower 花 鲜花 +fluorine 氟 +flush 奔流 汜滥 脸红 +flutter 飞散 鼓翼 +fly 飞 苍蝇 飘扬 +foam 泡沫 +focus 集中 只顾 +fog 雾 +fold 折叠 摺痕 +folder 目录 文件夹 卷宗 +follow 下述 后面 +following 以下 +font 字体 +food 食品 粮食 食物 +fool 蠢猪 傻瓜 笨人 傻子 愚蠢 +foot 脚 呎 足 +for 为了 对于 +force 逼 强迫 +foreigner 外国 外国人 +foreplay 前戏 +forest 森林 +forever 永远 永久 +forget 忘记 +fork 叉 +form 形成 形状 表格 +formal 形式 +format 格式 正式 +former 前面 前者 前任 以前 +formula 公式 配方 +fort 堡垒 +forth 向前 +fortune 运气 财产 幸运 好运 侥幸 +forum 论坛 +forward 向前 前进 +found 创立 创设 +fowl 家禽 +fox 狐狸 +frame 框架 结构 +france 法国 +free 自由 解放 免费 空闲 +freeze 冻结 结冰 +freight 船货 货运 运费 +french 法文 法语 法国语 +frequency 频率 +fresh 鲜 新鲜 清爽 +friend 朋友 +friends 朋友们 +friendship 友谊 +fright 恐吓 恐怖 +frog 蛙 青蛙 +from 从 由 +front 前线 前面 +frost 霜 +fruit 水果 果实 禁果 +fry 油炸 油煎 +fuck 肏 姦 奸 操 性交 交配 交媾 +fuel 燃料 +fun 开心 玩笑 兴趣 +function 功能 函数 +fund 基金 +funny 滑稽 有趣 +fur 皮毛 裘皮 +furious 暴怒 +furnish 供给 装备 +furniture 傢 家具 +further 并且 更远 此外 +fury 愤怒 猛烈 +future 前途 将来 未来 +fuzzy 模糊 +gabon 加蓬 +gadfly 牛虻 +gadolinium 钆 +gain 获取 获得 +gale 强风 +gallop 奔驰 飞跑 +gambia 冈比亚 +gamble 赌 赌博 赌场 +game 游戏 猎物 比赛 +gamma γ Γ +gangster 流氓 痞子 无赖 古惑仔 小混混 二流子 捣蛋鬼 恶棍 +gap 代沟 缝隙 间隙 +garbage 垃圾 +garbled 乱码 +garden 花园 +gas 气体 +gate 门闸 +gather 搜集 +gay 快活 同性恋 +gaze 凝视 +gdp 鸡的屁 国内生产总值 +geek 技客 奇客 +gem 宝石 +gender 性别 +general 普通 一般 将军 +generate 生成 +generous 慷慨 丰饶 宽大 +genius 天才 +gentle 斯文 雅致 温和 +gentleman 先生 绅士 +geography 地理 +geometry 几何学 +georgia 佐治亚 格鲁吉亚 +german 德文 德语 +germany 德国 +get 获得 得到 +ghost 鬼 鬼妹 鬼姥 鬼婆 鬼门关 幽灵 +giant 巨人 +gift 礼物 赠品 +ginger 姜 +girl 女孩 姑娘 妹子 +girlfriend 女朋友 +give 付给 +glad 高兴 喜悦 愉快 +glance 瞥见 +glare 闪耀 +glass 玻璃 +glide 滑走 +globe 全球 成球形 +gloom 幽暗 阴沉 +gloomy 忧郁 +glorious 壮丽 +glory 荣 光荣 繁荣 +glove 手套 +glow 光辉 灼热 发红 +glue 胶 +gmt 格林尼治时间 +gnaw 啃咬 +go 去 +gold 金 黄金 +golden 金色的 金黄色的 +goldengate 金门 金门桥 +good 好 妙 +good 良好 优良 拿手 亚克西 合适的 和善的 +goodat 擅长于 +google 谷歌 古狗 +goose 鹅 +gorge 峡 +gorilla 大猩猩 +govern 支配 管制 统治 +government 政府 +grace 优美 恩惠 慈悲 +gracious 庄重 厚道 +grade 等级 程度 +graduate 毕业 渐次 渐渐 +grain 谷类 纹理 +gramma 文法 语法 +grand 伟大 壮丽 雄壮 +grandfather 祖父 +grandmother 祖母 +grandson 孙 +grant 允许 承认 许可 +grape 葡萄 +graph 图形 +grasp 抓住 握紧 +grass 草 草地 +grateful 感谢 +gratitude 谢意 +grave 严肃 严重 +great 伟大 巨大 +greece 希腊 +greed 贪心 贪 +greendam 绿坝 绿霸 +grief 伤心 悲伤 不幸 +grind 碾 擂 磨 +groan 呻吟 +grocer 杂货 +ground 地面 土地 +group 小组 集团 +groupsex 群交 换妻 +grow 生长 长成 +growl 咆哮 +guarantee 保证 包管 +guard 警卫 防守 +guess 猜测 以为 估计 +guest 客人 宾客 +guide 向导 +guinea 几内亚 +gulf 海湾 +gum 口香糖 +gun 枪 +gust 阵风 +guyana 圭亚那 +gym 健身房 体育馆 +haagendazs 哈根达斯 +habit 瘾 习惯 +habitat 栖息地 +hacker 骇客 黑客 +haha 哈哈 o(∩_∩)o +hail 高呼 +hair 发 头发 頭髮 +haiti 海地 +half 半 一半 半个 +hall 大厅 堂 +ham 火腿 +hamburg 汉堡 +hamburger 汉堡包 +hand 手 掰 +handbag 手提包 +handkerchief 手帕 手绢 +handle 把手 办理 +handshake 招呼 +handsome 俊俏 +hang 吊 悬 +happen 发生 碰巧 +happiness 幸福 +happy 幸福 高兴 性福 快乐 愉快 +happybirthday 祝你生日快乐! +happynewyear 新年好 +harassment 骚扰 性骚扰 +harbor 海港 +hard 硬 坚硬 拼命 +harden 坚固 顽固 +hardware 硬件 +harm 伤害 损伤 +harmful 有害 +harmless 无害 +harmony 调和 和谐 +harvard 哈佛大学 +harvest 收获 +has 有 +haste 急速 赶忙 +hasten 催促 +hastily 火急 匆忙 +hat 帽子 +hate 恨 憎恨 +have 有 +hawaii 夏威夷 +he 他 +head 头 头颅 首领 +headache 头痛 +headchop 斩首 +headcut 理发 剪头发 +heal 医治 治疗 +health 健康 健全 +heap 堆积 +hear 听见 听闻 听 +heart 心 心脏 +hearty 恳切 衷心 +heat 加热 +heater 加热器 电炉 +heating 暖气 +heaven 天堂 +heavy 重 沉闷 +hedge 篱笆 +heel 后跟 踵 +height 高地 高度 +helium 氦 +hello 喂 哈罗 你好 +helmet 冑 +help 帮助 帮忙 帮上忙 +hemorrhoidal 痔疮 +hence 从此 因此 此后 +her 她的 +here 此地 这儿 这里 +hero 英雄 +hi 嗨 你好 +hide 躲避 隐蔽 隐藏 藏有 +high 高 +higher 更高 越来越高 +highest 最高 +highway 高速公路 +hill 丘山 +him 他 +hind 后面 +hint 暗示 讽示 +hip 屁股 +hire 雇 +his 他的 +hiss 嘘嘘 +history 历史 +hit 打击 打中 命中 +hobby 爱好 +hohhot 呼和浩特 +hold 保持 握 +hole 窟窿 孔穴 洞 穴 +holiday 节日 假日 +holistic 整体 全部 +holistic 整体 整体主义的 +hollow 中空 凹 +hollywood 好莱坞 +holy 神圣 圣 +homework 作业 +honest 诚实 老实 正直 +honey 蜜糖 蜂蜜 蜜蜂 +honor 名誉 +hoop 滕圈 铁环 +hop 跳跃 +hope 希望 相信 +horizon 地平线 +horn 号角 +hornet 马蜂 胡蜂 +horrible 可怕 可恶 +horror 恐怖 战栗 +horse 马 馬 +hospital 医院 病房 +host 主人 +hot 热 热烈 +hotel 旅馆 酒店 +hotkey 快捷键 热键 +hottie 辣妹 帅哥 +hour 时 时间 小时 +house 房 房子 +househusband 全职爸爸 家庭妇男 家庭主夫 +housewife 全职妈妈 家庭主妇 +houston 休斯敦 +how 怎么 如何 多么 怎么办 肿么办 +however 然而 但是 可是 +huge 巨大 +hum 哼哼 嗡嗡 +human 人性 +humidity 湿度 +hummer 悍马 +humor 幽默 +hundred 百 佰 +hungary 匈牙利 +hungry 饥 饥饿 饥荒 +hunt 猎 打猎 搜索 +hunter 猎人 +hurl 抛 +hurricane 飓风 狂飙 台风 暴风骤雨 龙卷风 急风暴雨 +hurry 匆忙 急忙 +hurt 伤疼 +hush 嘘 别作声 寂静 沉默 +hushmoney 遮羞费 封口钱 +hydrogen 氢 +ice 冰 甲基苯丙胺 大力丸 +icecream 冰淇淋 雪糕 +icefire 冰火 +iceland 冰岛 +icon 偶像 图标 图符 图示 +id 身份证 +idaho 爱达荷 +idea 想法 主观 观念 见解 意思 +ideal 理想 观念 +idiom 成语 习语 方言 土语 +idiot 白痴 +idle 懒惰 无益 +if 如果 倘若 假使 +ignore 忽略 省略 +ill 病 邪恶 疾病 +illinois 伊利诺斯 +illustrate 图解 插图 说明 +image 图像 映像 肖像 +imagine 想像 推测 猜想 +ime 中文输入法 输入法 拼音输入法 +immediate 马上 立刻 +imperial 帝国主义 +important 重要 +impotence 阳痿 +improve 改良 进步 +inch 英寸 +incline 偏向 倾斜 +include 包括 包含 +increase 增加 +indeed 果真 实在 的确 +independence 独立 +independent 独立的 +india 印度 +indiana 印第安纳 +indicator 跡象 +indignant 气愤 +indirect 间接 +individual 各个 个别 +indonesia 印尼 印度尼西亚 +induce 归纳 +indulgence 嗜好 +industrious 勤勉 +industry 工业 刻苦 +inevitable 不可避免 必然 +inexpensive 贱 +infant 婴 婴儿 +infect 传染 +inferior 下辈 劣势 +inflation 涨价 膨胀 +influence 影响 +info 资讯 信息 +inform 告发 告诉 通知 +information 信息 资讯 +inhibit 禁止 +initiative 倡议 主动 能动性 初步行动 +ink 墨水 +inn 小旅馆 +inner 内部 里面 +innocent 天真 无罪 +input 输入 输入法 +inquire 询问 调查 追问 +insect 虫 昆虫 +insert 插入 上字 上屏 +inside 内部 +insist 坚持 咬定 +inspiration 灵感 +install 安装 +instant 即刻 立即 立刻 实例 +instead 代替 抵作 +institute 机构 +instrument 仪器 +insurance 保险 +insure 保险 +integer 整数 +integrate 集成 +intelligence 智能 +intelligent 知识分子 +intend 打算 想要 +intercourse 性交 +interest 兴趣 利息 +interface 接口 界面 +interlock 连锁 交错 +internal 內在的 内码 +international 国际 +internet 互联网 +interrupt 中断 +interrupter 中断器 +interval 区间 间隔 +interview 面试 +into 进入 +introduction 介绍 引导 引言 +invade 侵略 +invent 发明 +invest 投资 花费 +invisible 看不见 +invite 招待 邀请 +involve 牵涉 参与 +iodine 碘 +iowa 衣阿华 +ipo 上市 +iq 智商 +iran 伊朗 +iraq 伊拉克 +ireland 爱尔兰 +iron 铁 熨斗 +is 是 +island 岛 +israel 以色列 +it 它 +italy 意大利 +item 条目 +iterate 叠代 +iteration 迭代 复述 复诵 +its 它的 +ivy 常春藤 +ivyleague 常春藤联盟 +jam 果酱 +jamaica 牙买加 +japan 日本 +japanese 日本人 +jar 瓶 壶 瓮 缸 +jaw 颚 +jeans 牛仔 牛仔裤 +jeanswest 真维斯 西部牛仔裤 +jelly 冻胶 果子冻 +jesus 耶稣 耶穌 +jet 喷气式飞机 +jews 犹太人 犹太裔人 +job 工作 +join 加入 联接 结合 +joke 笑话 玩笑 +jordan 约旦 +journal 旅行 杂志 +journey 旅游 旅程 旅途 +joy 快乐 +jpy 日圆 日元 +judge 判决 判断 审判官 法官 +judgment 判断 +juice 果汁 汁 +jump 跳跃 蹦跳 +junction 结 +junkfood 垃圾食品 +just 刚才 恰好 正当 +juyiqi 居移气,养移体 +karma 因果报应 因果 热度值 +keen 尖锐 热心 激烈 +keep 保存 保持 保留 +kentucky 肯塔基 +kenya 肯尼亚 +kettle 水壶 +key 键 钥匙 关键 +keyboard 键盘 +kick 踢 +kid 小孩 +kidney 肾 +kill 杀 杀死 +killer 杀手 +kilogram 千克 +kiloliter 千升 +kilometer 千米 +kind 种类 +kindle 点火 燃烧 焚烧 煽动 +kindness 亲切 仁慈 恳切 +king 国王 +kiss 接吻 亲嘴 +kitchen 厨房 +km 千米 公里 +knee 膝盖 膝关节 +kneel 跪 +knife 刀 餐刀 +knit 编 编织 +knob 钮 +knock 敲 +know 懂 知道 晓得 了解 认识 认得 +knowledge 知识 +koran 可兰经 +korea 高丽 韩国 朝鲜 南韩 北韩 +korean 韩文 +kowtow 磕头 +kowtow 磕头 +krypton 氪 +kungfu 功夫 +kuwait 科威特 +lab 实验室 +label 标签 题签 +labor 劳动 +lace 带子 花边 +lack 缺乏 不够 +lad 小伙子 +lady 女士 妇人 +lake 湖泽 湖 +lamb 羊肉 羊羔 小羊 +lambda λ Λ +lame 残废 +lamp 灯 +land 土地 陆地 +landscape 风景 +lane 小径 胡同 +language 语言 +lantern 元宵 手灯 灯笼 街灯 +laptop 手提电脑 笔记本电脑 +large 广大 宽阔 +last 延续 持续 最后 +lasvegas 拉斯维加斯 +late 后 晚 迟 +lately 最近 近来 +later 后来 更迟 +latest 最新 +latitude 纬度 +latter 后者 后面 近来 +latvia 拉脱维亚 +laugh 笑 嘲笑 +laughter 笑声 +launch 下水 发射 +law 法 法律 法则 +lawn 草地 +lawyer 律师 法律家 +lay 放下 生蛋 +layoff 裁员 炒鱿鱼 +lazy 懒 惰 懒惰 +lead 铅 引导 领导 +leaf 叶 叶子 +leak 泄露 漏洞 +lean 靠 +leap 闰 跳动 +learn 学习 +least 最小 +leave 离开 出发 遗留 +lebanon 黎巴嫩 +lecture 讲义 讲演 +left 左 左边 +leg 腿 +legend 传说 +leica 徕卡 +leisure 空闲 擂台 闲暇 +lemon 柠檬 +lend 借贷 +length 长度 +lenovo 联想 +lesotho 莱索托 +less 更小 较小 +lesson 课 教训 +lest 免得 +let 让 允许 +lets 让我们 +letter 字母 信 信件 +level 水平 平面 +levis 李维斯 牛仔裤 +levitra 德国伟哥 艾力达 +lexus 凌志 +lhasa 拉萨 +library 图书馆 +libyan 利比亚 +lid 盖 盖子 +life 生命 生活 +lift 举起 提起 +light 光亮 光 轻 +like 喜欢 好像 立刻 +likely 大概 可能 +limb 四肢 手足 +limit 极限 有限 范围 限制 +line 线 +link 连接 连环 +lion 狮 狮子 +lip 唇 嘴唇 阴唇 +liquid 液体 +list 列表 名单 +listen 听 倾听 +lithuania 立陶宛 +litigation 诉讼 打官司 +little 少量 少许 小 少 +live 居住 活 +lively 热闹 活泼 爽快 轻快 明快 +loach 鳅 +load 装载 负荷 货物 +loan 贷款 +lobby 厅 +local 本地 +lock 锁 +lodge 小屋 投宿 +logic 逻辑 +logo 徽标 +london 伦敦 +lonely 孤独 寂寞 +long 长 +longer 更长 越来越长 +look 看 见 瞧 看见 +loose 松 松弛 不紧 +lord 君主 贵族 领主 +lose 输 输掉 丢掉 +loss 遗失 损失 +lot 大批 大量 +loud 大声 +loudspeaker 喇叭 +louisiana 路易斯安那 +love 爱 情 爱情 +lovely 可爱 美好 +lover 情人 爱人 +low 低 +lower 更低 越来越低 +lowest 最低 +luck 运气 幸运 +lucky 饶幸 +luggage 行李 +lummox 傻大个儿 笨伯 愚蠢不中用者 +lunch 午餐 午饭 +lung 肺 +macau 澳门 +macedonia 马其顿 +machine 机器 +macro 宏 宏观 +mad 疯狂 +madam 太太 夫人 +madman 狂人 疯子 +magic 魔术 魔術 魔法 +magnet 磁 +magpie 鹊 +mahjong 麻将 +maid 姑娘 少女 +maiden 闺女 +mail 寄邮 邮寄 寄信 +main 主要 +maine 缅因 +maintain 维持 +major 多数 +make 制造 +malaria 疟 +malawi 马拉维 +malaysia 马来西亚 +maldives 马尔代夫 +male 男 雄 +mall 购物中心 林荫路 +malt 麥芽 +malta 马耳他 +man 人 男人 +manage 管理 +manager 经理 +mandarine 国语 普通话 中国官话 马褂 +mankind 人类 +manner 方法 样式 礼仪 +manual 说明书 手动 +manufacture 制 制造 +many 很多 许多 多数 +map 地图 +maple 枫 +mark 分数 标记 +market 市场 +marry 结婚 +marx 马克思 马克思主义 +maryland 马里兰 +mask 屏蔽 掩膜 面具 +mass 群众 +massacre 杀人狂 +massage 按摩 +mast 桅柱 桅 +master 师傅 高手 主人 大师 牛人 掌握 控制 +masturbation 打飞机 +match 匹配 火柴 +material 材料 物质 唯物 +math 数学 +mathematics 数学 +matrix 矩阵 子宫 模型 模子 铜模 +matter 事情 物质 +mattress 床垫 空气垫 +mauritius 毛里求斯 +mayer 市长 +mayor 市长 +me 我 +meadow 牧场 草原 草地 +meal 餐 饮食 +mean 平均 +meaning 意思 意味 +meantime 同时 +measure 测量 +meat 肉 +medal 奖章 +medicine 药 医药 医学 +medium 媒介 介质 +meet 遇见 会见 迎接 +meeting 会议 集会 +melt 熔融 溶化 融化 +member 会员 +memo 备忘 备忘录 待办事项 便笺 +memoranda 备忘录 +memory 记忆 内存 记忆体 +mend 修补 订正 改订 +mention 谈到 提及 +mercury 汞 +mere 不过 仅仅 +merge 浸淹 +merry 快活 +message 消息 +metal 金属 +meter 米 公尺 +method 方式 方案 方法 +mexico 墨西哥 +miami 迈阿密 +michigan 密执安 +micro 微 微观 +microsoft 微软 +middle 中央 中间 中学 +midnight 午夜 +mild 温和 柔和 +mile 英里 英哩 +milestone 里程碑 +milk 奶 牛奶 +milligram 毫克 +milliliter 毫升 +millimeter 毫米 +million 兆 百万 +millionaire 百万富翁 +millipede 马陆 千足虫 +mimic 模仿 模拟 +mind 意志 智力 +mine 我的 水雷 矿山 矿 +mineral 矿物 +mingle 混合 +minnesota 明尼苏达 +minor 少数 较小 +minus 减 +minute 分 分钟 片刻 一会儿 +mirror 镜 镜子 +miscellaneous 杂七杂八 杂项 +misfortune 倒运 +miss 小姐 密斯 失去 想念 +mississippi 密西西比 +missouri 密苏里 +mistake 错误 +mister 先生 +mit 麻省理工学院 +mix 混合 +mixture 混合物 +mode 方式 模式 模型 +model 模型 模范 典范 型号 +modern 摩登 现代 近代 +modify 修改 改进 +module 模块 +moist 润湿 水分 湿气 潮湿 +moko 美空 +molecule 分子 +mom 妈 妈妈 +moment 一瞬间 刹那 片刻 +monaco 摩纳哥 +money 钱 金钱 +mongolia 蒙古 +monitor 监视器 +monkey 猴子 +montana 蒙大拿 +month 月 月份 +mood 心情 情绪 语气 +moon 月 月亮 +mooncake 月饼 +moral 寓意 教训 道德 +morale 士气 纪律 +more 更加 更多 较多 越越 +morning 早上 上午 拂晓 早上好 晨 朝 +morocco 摩洛哥 +mosquito 蚊 +moss 苔藓 +most 最 +mother 母亲 妈 娘 +motion 举动 行动 转动 +motor 马达 发动机 +motorcycle 摩托车 +mountain 山 山脉 +mourn 哀悼 悲伤 +mouse 老鼠 耗子 鼠标 +mouth 口 嘴 +move 移动 运动 +movement 运动 +movie 电影 +mrs 太太 夫人 +much 大量 很多 许多 +mud 泥 +murder 谋杀 杀人 杀害 +murmur 发牢骚 诉怨 +museum 博物馆 +music 音乐 乐 +muslim 穆斯林 +must 必须 必需 必要 +mutual 共同 相互 +my 我的 +myanmar 缅甸 +myself 我自己 +nagoya 名古屋 +nail 钉 钉子 趾甲 指甲 +nake 裸 裸体 裸露 +naming 名 名字 姓名 名称 命名 +narcissism 自恋 自赏 自我陶醉 +narrow 狭隘 狭窄 +nasty 肮脏 卑鄙 讨厌 +nation 国家 民族 +native 土产 本地 +natural 自然的 +nature 自然 天性 性质 +navy 军舰 海军 +nazi 卐 纳粹 +near 接近 附近 +nearly 几乎 差不多 近乎 +nebraska 内布拉斯加 +necessary 必要的 必须的 +neck 颈 脖子 +need 需要 要求 +needle 针 +negative 负 非 +neglect 不顾 忽略 疏忽 +neighbor 邻居 +neither 既不 又不 +neon 氖 +nepal 尼泊尔 +nephew 侄子 外甥 +nest 巢 窝 +net 网 +netherlands 荷兰 +network 网络 联网 +nevada 内华达 +never 永不 从不 决不 未曾 +new 新 新的 +newest 最新 +newhampshire 新罕布什尔 +newjersey 新泽西 +newmexico 新墨西哥 +news 新闻 消息 +newspaper 报纸 +newton 牛顿 +newyork 纽约 +newzealand 新西兰 +next 下次 其次 +nfc 近场通信 近距离无线通信 +nice 美好 善良 +niece 外甥女 侄女 +niger 尼日尔 +nigeria 尼日利亚 +night 夜晚 晚上 +nike 耐克 +nitrogen 氮 +no 没有 +noble 清高 贵族 高贵 +nobody 没人 +node 节点 +noise 噪音 噪声 吵闹 嘈杂 +none 没人 没有 +nonsense 废话 胡扯 荒唐 +noon 中午 正午 +nor 也不 +normal 正常 +northcarolina 北卡罗来纳 +northdakota 北达科他 +norway 挪威 +nose 鼻 鼻子 +not 不 没有 +note 【注】 注意 备忘录 笔记 +notebook 笔记簿 笔记本电脑 +notice 注意 公告 通知 +novel 小说 新奇 +now 现在 inow +today 今天 itoday +nude 裸 裸体 裸妹 +number 数字 号码 +numerous 许多 众多 +nurse 护士 保姆 姆妈 保育员 +nurser 托儿所 养殖场 苗床 +nut 坚果 +nutty 坚果味的 疯疯癫癫的 +nylon 尼龙 +oak 橡树 桨 +obama 奥巴马 欧巴马 +obey 顺从 服从 听从 +object 物体 事物 +obligatory 强迫 +obscene 淫秽 淫穢 +observe 遵守 观察 +obsolete 废弃 +obstacle 障碍 绊脚石 +obtain 获得 得到 +obvious 明白 显然 +occupy 占领 +occur 发生 想起 +ocd 强迫症 +ocean 海洋 洋 +odd 奇怪 零碎 +ofcourse 当然 +off 离开 那边 +offer 提供 奉献 +office 办公室 办事处 +officer 职员 +official 官方 +offline 离线 +often 经常 常常 时常 往往 每每 不时 +ohio 俄亥俄 +oil 油 +oklahoma 俄克拉何马 +old 老 旧 年老 +oldman 老翁 +olive 撖榄 +olympic 奥林匹克 +oman 阿曼 +omega ω Ω +omg 我的天哪 +ominous 不吉利 +omit 省略 遗漏 删去 +omni 全方位 万能补全 智能补全 +on 上面 +once 一旦 从前 +online 在线 +only 只有 唯一 +ons 一夜情 +opaque 不透明 +opec 欧佩克 +open 打开 开 开启 +opera 歌剧 +operate 操作 动作 开刀 手术 +operater 调度员 +operation 手术 操作 +opportunity 机会 机遇 时机 +oppose 反对 反抗 +opposite 对面 相反 相对 +optimum 最优 最佳 +option 选项 任选 +or 或 或者 或许 否则 +oracle 甲骨文 +orange 桔子 橙子 橘子 +orangeade 橘子水 +order 定购 顺序 次序 秩序 排序 命令 +ordinary 普通 平凡 +oregon 俄勒冈 +organ 器官 风琴 +organization 组织 +orgasm 情欲高潮 +origin 出身 原点 最初 独创 由来 起源 +os 操作系统 +oscillator 振荡器 +oslo 奥斯陆 +other 别 其他 另外 别人 +otherwise 否则 +ottoman 奥斯曼 鄂图曼 +ought 应该 +our 我们的 +out 出 出外 +outdoor 户外 +outline 轮廓 梗概 +output 输出 +outside 外面 外边 +outstand 突出 +outward 外表 向外 +oven 炉灶 +over 越 +overcome 打败 克服 +overcover 外套 大衣 +overflow 溢出 +overlap 重叠 +overtake 追上 +overwork 过劳 +owe 欠债 +own 拥有 +oxygen 氧 +pace 步伐 +pacific 太平洋 +pack 包 填装 +package 包装 包裹 +pad 垫 垫子 +page 页 +pain 痛苦 疼痛 辛苦 +paint 油漆 +painter 画家 +painting 油画 刷漆 +pair 双 +pakistan 巴基斯坦 +palau 帕劳 +pale 发青 苍白 +palm 手掌 棕榈 奔迈 +pan 锅 +panama 巴拿马 +panda 熊猫 猫熊 +pandora 潘多拉 潘多拉魔盒 +panorama 全景 全景画 全景照片 +paparazzi 狗仔队 +paper 纸 +parable 寓言 +parade 检阅 +paradigm 范例 +paradox 悖论 吊诡 +paragraph 段 +paraguay 巴拉圭 +parallel 平行 +parameter 参数 +paranoid 偏执狂 妄想症患者 +parcel 包裹 +pardon 原谅 宽恕 +parents 父母 双亲 +paris 巴黎 +park 公园 +parliament 议会 +parlor 客厅 坐谈室 +parsimony 吝啬 节俭 +part 分开 部分 +particular 特定 特殊 +partly 部分 多少 +party 派对 晚会 +pass 通过 走过 +passage 通路 通行 +passenger 旅客 乘客 +past 过去 往事 +paste 粘贴 +pasture 牧草 牧场 +patent 专利 +path 途径 小路 径 +patience 耐心 耐性 忍耐 +patient 病人 患者 耐烦 耐得烦 +pattern 模式 图像 +pave 铺路 +pay 支付 +paypal 贝宝 +pea 豌豆 +peace 和平 +peach 桃 +peacock 孔雀 +peanut 花生 +pear 梨子 鸭梨 +peculiar 独特 特有 +pedophilia 恋童癖 +peep 偷窥 窥视 偷看 +peg 塞子 木钉 +pen 笔 +pencil 铅笔 +penis 屌 阴茎 命根 +pennsylvania 宾夕法尼亚 +penny 辅币 辨士 +peon 日工 雇农 听差 +people 人民 人们 +perceive 知觉 看出 理会 +percent 比率 百分率 百分比 +percept 理解 +perfect 完全 完成 完美 +perform 实行 表演 节目 性能 +perhaps 或许 多半 +period 句号 周期 期间 +peritonsillar 扁桃体 +permanent 恒 永久 +permit 允许 许可 容许 准许 +persevere 孜孜不倦 不屈不挠 +persist 坚持 固执 硬说 +person 人 +peru 秘鲁 +pet 宠物 爱畜 +petn 季戊四醇 +pfizer 辉瑞 +phone 电话 +phase 相位 +phd 博士 博士学位 +philippines 菲律宾 +philosophy 哲学 +phoenix 凤 +phosphate 萤光 +phosphorus 磷 +photo 相片 照像 +phrase 词组 短语 +physics 物理学 +piano 钢琴 +pick 拣 摘 +pickle 泡菜 咸菜 腌黄瓜 +picnic 郊游 +picture 图片 相片 图画 +pie 馅饼 +pig 猪 猪猡 +pigeon 鸽子 +pile 堆积 +pillar 顶梁柱 支柱 柱子 柱石 +pillow 枕头 +pine 松树 +pineapple 菠萝 凤梨 +pipal 菩提树 +pit 坑 陷井 +pity 可怜 怜悯 遗憾 +pivot 枢轴 支点 中心 核心 +pixel 像素 +pizza 比萨 比萨饼 +place 地点 地方 场所 +plagiary 抄袭 剽窃 作弊 剿袭 剽袭 +plain 朴素 平坦 单色 +plan 计划 +planet 行星 +plant 植物 +plastic 塑料 +plat 平台 +plate 底片 板 碟 +platform 月台 +play 玩 玩耍 演奏 +player 玩家 玩法 +pleasant 舒适 愉快 +please 请 +pleasure 快乐 高兴 +plenty 丰富 +plot 情节 阴谋 策划 +plough 犁 耕怍 +plug 插入 插塞 插上 +plugin 插件 插入 +plugplay 即插即用 +plum 李子 梅子 +plumb 测水锤 探测 垂直 铅直 +pocket 衣袋 +poem 诗 诗歌 +poet 诗人 +point 指示 指出 点 +poison 毒 +poker 扑克 +poland 波兰 +pole 极点 极 竿 +police 警察 +policer 派出所 +policy 政策 +polish 光泽 擦亮 磨光 +polite 斯文 礼貌 +ponzi 庞氏骗局 +pool 池 +pool 游泳池 水坑 +poor 穷 可怜 贫穷 +popcorn 爆米花 爆玉米花 +poppy 罂粟花 +popular 流行 普及 通俗 +population 人口 +pork 猪肉 +porsche 保时捷 +port 港口 +portion 分配 部分 +portrait 肖像 描写 形像 +portugal 葡萄牙 +position 位置 地位 立场 +possess 具有 占有 所有物 据有 财产 +possible 可能 靠谱 +post 岗位 邮件 +postage 邮票 +postbox 邮箱 +postcard 明信片 +postman 邮递员 +postoffice 邮政局 +potato 土豆 马铃薯 +potential 潜能 +pound 英镑 +pour 注 灌 +pour 灌注 +poverty 贫穷 缺乏 +powder 火药 粉末 香粉 +power 功 动力 权力 力量 +powerful 强大的 +practice 实行 开业 演习 +praise 赞美 称赞 +pray 祈祷 +precious 昂贵 贵重 +precise 精密 +precision 精确 准确 细致 +predict 预测 预计 预言 预报 意料 +predictability 可预测性 +prefer 宁愿 +premier 首相 国务卿 +prepare 准备 +preposition 前置 介词 +present 礼物 现在 +presently 马上 立刻 +president 总裁 总统 主持 议长 +press 压 按 +pressure 压力 压强 应力 +pretend 借口 假装 妄想 +prevent 防止 阻止 +price 价钱 +priest 牧师 僧人 +primary 最初 基本 初步 +primer 入门 初学者 +principle 原则 原理 本钱 校长 主义 +print 打印 印刷 +prison 囚犯 监狱 俘虏 +private 私人 秘密 +prize 奖品 奖赏 +probability 概率 +probable 可能 大概 +problem 问题 难题 +proceed 前进 处理 进行 +process 过程 方法 流程 处理 +produce 生产 产生 +product 产品 产物 制造 提供 提出 生产品 +profess 表白 +profession 专业 +professor 教授 叫兽 禽兽 +profit 利润 盈余 +profligacy 放荡 不检点 浪费 +program 程式 程序 +progress 前进 进步 +project 计划 项目 映射 +promise 约定 希望 允诺 承诺 +promote 促进 鼓励 +prompt 提示 +propagate 传播 +propel 螺旋桨 +proper 适当 +property 属性 财产 性能 特性 产权 财产权 所有权 家当 +prophecy 预言 预告 预示 预言书 +proposal 草案 +proselytism 劝诱改信仰 +prostate 前列腺 +protect 保护 +protein 蛋白质 +protocal 协议 +proud 骄傲 自尊心 +prove 证明 判明 +provide 提供 供给 +province 省 地方 +prozac 百忧解 氟西汀 +psychology 心理学 +public 公共 公立 +publish 发行 公开 公布 +puertorico 波多黎各 +pull 拉 牵引 +pulse 脉冲 +pump 抽 水泵 +punctuation 标点 +puncture 准时 按时 +punish 处罚 惩 +pure 纯粹 +purse 钱袋 荷包 +push 推 +pussy 屄 普世 小猫咪 女阴 阴户 +put 放置 +puton 戴上 穿上 +python 蟒蛇 +qatar 卡塔尔 +qr 二维条码 +quail 鹌 鹑 +quantity 量 数量 +quarrel 口角 吵架 +quarter 一刻 四分之一 +queen 皇后 女王 +queer 古怪 奇特 不是味儿 +question 问题 问号 疑问 论点 +quick 快捷 快速 迅速 +quiet 温和 静 谧 +quite 完全 +quiver 摇动 +quiver 震 颤 +quotation 引用 语录 +quote 单引号 引用 援引 摘引 断字符号 +rabbit 兔子 +race 人种 竟赛 赛跑 +racket 吵闹 +radio 收音机 +radish 萝 +radon 氡 +rag 破布 +rage 激烈 愤怒 +rail 栏杆 轨道 +rain 雨 +rainbow 虹 彩虹 +raincoat 雨衣 +raise 抬起 提高 +range 范围 +rank 队伍 阶级 +rape 强奸 +rapid 迅速 急流 +rare 稀少 珍奇 少有 +rarely 难得 很少 +rat 老鼠 耗子 +rate 价目 比例 等级 +rather 宁可 有点 +raw 原始 +ray 光线 闪烁 +razor 剃刀 +reach 到达 +read 读 阅 阅读 +reader 读者 读本 +real 实际 现实 真正 +realize 实现 +really 实在 真的 +reap 收割 +rear 后卫 后部 殿军 +reason 原因 理由 理性 道理 缘故 缘由 情理 来由 理智 +receipt 收据 领受 +receive 收到 接受 +recent 近来 新近 +recite 背诵 讲述 +recognition 识别 +recommend 推荐 保送 +record 记录 录音 +recover 恢复 收回 痊愈 +recurse 递归 +reduce 减少 +redwood 红木 +redwoodcity 红木城 +refer 参考 参见 参照 提到 提交 谈到 隐射 谘询 +reference 参考 +references 参考文献 +refine 炼 +reform 改革 +refrigerator 冰箱 +refuse 拒绝 辞退 +regard 关心 注意 认为 +register 暂存器 +regret 后悔 抱歉 遗憾 +regular 正规 有规则 +reign 支配 朝代 统治 +rejoice 高兴 欢喜 +relate 叙述 有关系 +relation 关系 亲戚 +relative 亲戚 亲属 +relax 松弛 弛缓 +release 释放 +reliable 可靠 稳妥 确实 牢靠 确切 稳当 +rely 依赖 依靠 倚靠 信赖 凭借 依仗 倚仗 凭靠 凭仗 +remain 剩下 剩余 残存 留下 遗留 +remember 记忆 记起 +remind 提醒 想起 +remove 消除 清除 拆除 排除 解除 撤除 扫除 +renew 更新 +renxinqi 人心齐,泰山移 +repair 修理 赔偿 +repeat 重复 反复 +repeater 中继器 +replace 代替 替换 置换 取代 +reply 回复 回帖 +report 报告 +reporter 记者 +repost 【转贴】【转载】 +represent 代表 表示 +request 要求 请求 +require 要求 需求 +rescue 救助 解救 +research 研究 +reset 重新设定 重新组合 清零重设 +reside 驻留 +residual 残留 +resistance 电阻 +resolution 分辨率 +resource 资源 +respect 尊敬 +response 响应 +rest 休息 其余 +restoration 恢复 +result 结果 结论 +resume 简历 +retire 退休 退隐 +retrieve 弥补 +return 返回 归 +reverse 反 翻 颠倒 +review 复习 +revision 修订 修改 修订本 修订版 +revolution 革命 +reward 报酬 酬谢 奖赏 +rfid 电子标签 射频识别 +ribbon 丝带 +rice 饭 +rich 富 富有 有钱 富裕 +rid 除去 驱除 +riddle 谜 +ride 骑 乘 +rider 骑师 +ridiculous 荒谬 岂有此理 +right 右 右边 权利 正确 +ring 指环 +rio 桑巴 里约热内卢 +ripe 熟 成熟 +rise 上升 起来 +risk 冒险 危险 +river 河流 河 川 +road 路 道路 +roam 徘徊 流浪 +roar 咆哮 +roast 烤 烧烤 +rob 抢夺 抢 夺 +robber 强盗 盗贼 +robe 长袍 +rock 岩石 动摇 +role 职能 地位 角色 +rolex 劳力士 +roll 纸卷 滚 +roller 滚轮 压路机 +romania 罗马尼亚 +roof 屋顶 +room 房间 屋子 余地 +root 根 根源 +rope 绳 +rot 腐蚀 +rotate 旋转 +rough 粗糙 粗陋 大约 +round 周围 +route 航线 路线 +row 行 排列 行列 +rub 摩擦 +rubber 橡皮 橡胶 +rude 无礼 粗暴 +rudubupahu 乳犊不怕虎 +rug 毯子 粗绒 +ruin 毁灭 没落 灭亡 +rule 规矩 规定 规则 潜规则 支配 统治 +rumor 谣言 谣传 +run 跑 跑步 运行 执行 +rush 匆忙 猛进 赶快 赶紧 +russia 俄国 +russian 俄语 俄罗斯联邦 +rwanda 卢旺达 +sack 劫掠 抢劫 +sacred 神 圣 神圣 +sacrifice 牺牲 +sad 悲伤 +sadan 撒旦 +safari 狩猎 狩猎旅游 +safe 安全 保险箱 +sage 圣人 先哲 贤能 鼠尾草 洋紫苏 +sail 航行 帆 +sailor 水手 海员 +salary 工资 +sale 出卖 销售 +salt 盐 +samba 桑巴 +same 同样 相同 +sample 样本 标本 样品 +sand 沙 +sandbox 沙盒 沙箱 +satisfy 满意 满足 +save 救 储蓄 节省 保存 +say 说 +sbc 商业行为规范 +scale 比例 +scam 花招 欺诈 诈财骗局 +scan 扫描 +scarce 稀有 缺乏 罕见 +scatter 扩散 散布 驱散 +scene 光景 场面 +scenery 风景 景色 +scent 香味 香水 +scholar 学者 +school 学校 +science 科学 +scissor 剪刀 +scold 骂 责骂 +score 得分 +scratch 搔抓 +scream 尖叫 +screen 屏幕 上屏 +screenshot 屏幕截图 +screw 螺丝钉 螺旋桨 +script 原稿 笔迹 +scroll 滚动 +scut 华南理工大学 +sea 海 大海 +seagull 海鸥 +seal 封印 图章 海豹 海陆空 +seamless 无缝 无缝混排 无缝连接 无缝接驳 +search 搜索 查询 人肉 +season 季节 春耕 夏耘 秋收 冬藏 +seat 席位 座位 +seaturtle 海龟 海归 海不归 +secret 秘密 机密 +secretary 秘书 书记 干事 +secretions 淫水 阴精 +section 区域 部分 +secular 世俗 +security 安全 治安 保安 +see 看见 +seed 种子 +seek 寻找 寻觅 追求 +seem 貌似 似乎 好像 +seldom 寥寥 稀少 难得 +select 选择 挑选 +selenium 硒 +self 自己 自我 自己的 +sell 卖 出售 销售 +send 送 发送 打发 遣送 +senegal 塞内加尔 +sense 意味 意思 感觉 +sensitive 敏感 敏感词 敏感瓷 +sentence 句子 宣判 判决 +seoul 汉城 首尔 +separate 分开 区别 各别 +sequence 顺序 序列 +series 系列 连续 级数 串联 +serious 严肃 严重 庄重 认真 +servant 仆人 +serve 服务 合用 侍候 +server 服务器 伺服器 +service 服务 杀必死 +set 集合 集 放 +settle 搞踮 搞妥 +several 几个 +severe 严格 剧烈 +sew 缝 +sex 性 ♀ ♂ 性别 性欲 嘿咻 +sexual 性欲 +sexy 性感的 +sf 旧金山 +sfo 旧金山国际机场 +shade 树荫 阴处 廕 荫 +shadow 影子 +shake 摇 +shallow 浅 水浅 浅薄 +shaman 萨满 巫师 +shame 丢脸 侮辱 耻辱 恥 +shape 形状 样子 +share 共享 分享 股份 +shark 鲛 +sharp 乖巧 锐利 尖 +shave 剃 +she 她 +sheep 羊 +sheet 床单 +shelf 架子 +shell 壳 贝壳 外壳 炮弹 +sheraton 喜来登 +shine 发光 照耀 +shirt 衬衫 +shiver 发抖 打颤 +shock 冲击 惊愕 震动 +shoe 鞋 鞋子 +shoot 发射 开枪 发芽 +shop 商店 铺子 +shore 海岸 湖滨 +short 短 简短 +shortcoming 缺点 +shortcut 捷径 近路 便道 +shorter 更短 越来越短 +should 应当 应该 +shoulder 肩膀 +show 显示 出示 展览会 +shower 阵雨 +showwindow 橱窗 陈列窗 +shrimp 虾 +shrink 缩 收缩 +shrub 灌木 +shy 害臊 怕羞 +sick 生病 不舒服 +sickness 疾病 +side 边 侧旁 +siege 围城 围攻 包围 +sigh 叹气 +sight 名胜 视力 +sigma σ Σ +sign 符号 信号 +signature 签名 +silence 寂静 沉默 +silicon 硅 矽 +siliconvalley 硅谷 +silk 丝 绸丝 +silly 愚蠢 可笑 +silver 银 +similar 类似 相似 同样 +simple 简单 朴素 +simplest 最简单 最容易 +simulate 模拟 仿真 +sincere 衷心 诚实 +sing 唱 唱歌 歌曲 +singapore 新加坡 +singer 歌手 +single 单身 单独 单数 一个 单个 +sink 凹陷 沉下 +sir 先生 +sister 姐姐 姊妹 +sit 坐 +situation 形势 情况 情形 +size 大小 尺寸 +skate 溜冰 +skeleton 骨架 骨骼 尸骨 骨头架子 +ski 滑雪 雪撬 +skilful 巧妙 +skill 技巧 技能 技艺 本事 身手 本领 熟练 手法 功夫 +skin 皮 皮肤 +skirt 裙 裙子 +skull 髅 +sky 天 天空 +slash 正斜杠 +sled 雪撬 +sleep 睡 睡觉 睡眠 挺尸 +sleeve 袖子 +slender 苗条 细长 纤弱 +slight 微细 轻视 轻微 +slip 溜进 滑倒 过失 +slope 斜坡 倾斜 +slovakia 斯洛伐克 +slovenia 斯洛文尼亚 +slow 慢 迟钝 +sluggish 滞 +slut 荡妇 懒妇 +sly 狡猾 暗中 +smaller 越来越小 +smart 机灵 智能 高明 英明 +smell 香味 闻到 +smile 微笑 +smoke 烟 抽烟 冒烟 +smooth 平滑 顺利 流利 +sms 短讯 +snail 蜗牛 +snake 蛇 +snatch 抢去 +snobbish 势利 +snow 雪 +so 所以 因此 +soap 肥皂 +sob 呜咽 +sober 清醒 +social 社会 +society 社会 +sock 袜子 +socks 袜 +soda 苏打 汽水 硷 +sofa 沙发 +soft 柔软 +software 软件 软体 +sogou 搜狗 +soil 污斑 弄脏 +soldier 军人 兵士 +solid 固定的 固体 +solidarity 齐心协力 同心同德 +solution 方案 答案 解决 +solve 解决 +somalia 索马里 +some 几个 有些 若干 某些 +somebody 某人 有人 +somehow 总要 +someone 有人 +something 有些 某事 +sometime 有时 往往 +somewhat 稍有 有点 略有 +somewhere 有点 稍有 略有 某处 +son 儿 儿子 +soon 马上 不久 +sore 疼痛 +sorrow 悔恨 悲哀 +sorry 抱歉 遗憾 可怜 +sort 排序 种类 +soul 灵魂 灵 魂 +sound 声音 健全 +soup 汤 +sour 酸 +source 源 +southafrica 南非 +sow 播种 +spade 铲 +spain 西班牙 +spanish 西班牙文 西班牙的 +spare 空闲 多余 +spark 火花 +sparrow 麻雀 +spartacus 斯巴达克斯 +speak 说 讲 说话 讲话 +speaker 演说者 发言人 +special 特殊 专门 专业 +spectacle 壮观 光景 +speech 讲演 +speed 速度 加快 +spell 拼写 +spend 花费 消遣 +sperm 精子 精虫 子弟兵 +spider 蜘蛛 +spin 纺 +spirit 精神 灵魂 +splendid 华丽 光辉 显赫 +split 分裂 +spoil 弄坏 纵坏 +spoon 匙子 调羹 +sporadic 零星 断断续续的 阵发性的 偶尔发生的 间或出现的 +sport 运动 +spread 传播 +square 广场 平方 +squirrel 松鼠 +stable 稳定 +stack 堆栈 +staff 职员 参谋 +stage 阶段 +stairs 楼梯 +stalk 柄 茎 +stamp 邮票 踏 +stand 站 起立 +standard 标准 +stanford 斯坦福大学 +staple 钉书针 +star 星 明星 ☆ ★ +starbucks 星巴克 +stare 疑视 +start 出发 开始 起动 +starve 饿死 挨饿 +stat 统计 +state 状态 情形 州 +static 静态 靜態 +station 车站 +statistics 统计 统计学 +statutory 法定的 成文的 +stay 逗留 +steady 坚固 稳定 不变 +steal 偷 窃取 +steam 蒸汽 +steel 钢 +steep 陡峻 险阻 +steeple 尖塔 +stem 杆 梗茎 +step 步 步骤 阶梯 梯级 +stern 严厉 冷酷 船尾 +stick 手杖 +still 静止 仍然 +sting 叮 刺 +stock 股票 股市 +stockholm 斯德哥尔摩 +stomach 肚子 胃 +stone 石 石头 岩石 果核 +stool 凳子 +stop 停 停止 +store 商店 存储 积蓄 贮藏 +storm 暴风雨 +story 故事 情节 +stout 勇猛 壮健 +stove 火炉 炉 +straight 直 +strange 奇怪 陌生 吊诡 奇异 怪异 +stranger 陌生人 +strategy 战略 +straw 麦秆 +strawberry 草莓 +stray 迷失 +stream 小河 河流 +street 街 +strep 链球菌 +stretch 展开 扩张 +strike 打击 +string 弦 字符串 +strip 剥 +stroke 击 笔划 笔画 +strong 强壮 +struggle 斗争 奋斗 挣扎 +student 学生 +study 学习 研究 +stuff 塞进 材料 +stupid 笨 愚蠢 +style 风格 +subject 主题 +submit 提出 屈服 +subscribe 订阅 +substitute 替代 +subway 地铁 +succeed 成功 继承 +success 成功 +such 这样 那样 +suck 吮吸 +sudan 苏丹 +sudden 突然 +suffer 容许 放任 蒙受 +sufficient 充分 丰富 足够 +sugar 糖 +suggest 建议 +suicide 自杀 被自杀 +suitable 适合 适宜 +sulphur 硫 +sum 总数 总计 总和 +summary 总结 总之 盘点 +sun 太阳 +sunny 晴天 +sunshine 阳光 +superior 优势 +supper 晚饭 +support 支持 扶养 拥护 支撑 +suppose 假定 假设 猜想 +sure 确实 的确 当然 +surface 表面 +surprise 惊奇 惊异 惊讶 惊愕 吃惊 +surrender 投降 +surround 包围 围绕 +sushi 寿司 +suspect 嫌疑 涉嫌人 可疑分子 +swan 天鹅 +swaziland 斯威士兰 +swear 发誓 +sweat 出汗 +sweden 瑞典 +sweep 扫除 打扫 +sweet 甜 甜蜜的 芳香 +swell 增大 肿起 膨胀 +swift 迅速 +swim 游泳 +swine 猪猡 下流坯 +swineflu 猪流感 +swing 秋千 摆动 摇摆 +swiss 瑞士 +swissarmy 瑞士军刀 +switch 开关 +swollen 肿 +sword 剑 刀剑 +syllables 音节 +symbol 符号 象征 +syndrome 综合症 +synonym 同义词 +system 系统 体系 +table 桌 桌子 表格 +tactics 战术 +tag 标签 +tail 尾巴 末端 +tailor 裁缝 +taiwan 台湾 臺灣 +take 取 拿 +tale 故事 +talk 讲话 谈话 +tame 驯服 +tank 坦克 +tape 磁带 录音带 +tardy 迟到 迟到的 缓慢的 迟缓的 +task 任务 工作 +taste 尝 尝鲜 味道 嗜好 +tattoo 纹身 +tax 税 抽税 +taxi 计程车 出租汽车 打的 的士 +tea 茶 茶叶 +teach 教 +teacher 老师 教师 先生 +team 队 团队 +tear 泪 眼泪 +technology 技术 +telegraph 电报 +telephone 电话 +tell 告诉 嘱咐 +temper 脾气 +temperature 温度 +temple 庙 庙寺 +temporary 暂时 +tendency 势 +tender 温柔 嫩绿 柔弱 柔软 +tennessee 田纳西 +tennis 网球 +tent 帐篷 帷幄 营帐 篷帐 +term 期限 术语 +terminal 终端 +terrible 可怕 +terror 恐怖 +test 测试 试验 考验 实验 考试 测验 +testicle 睾 +texas 德州 德克萨斯 +text 文本 案文 正文 课文 纂辑 +textbook 课本 教科书 +thailand 泰国 +thallium 铊中毒 +than 比 +thank 谢谢 感谢 鸣谢 +thanksgiving 感恩节 +that 那个 那种 那样 那么 那本 +theater 剧场 戏院 电影院 +their 他们的 她们的 +them 他们 她们 它们 +then 那么 于是 尔后 接着 然后 遂 +theory 理论 +there 那里 +therefore 所以 因此 +these 这些 +thesis 论文 +theta θ Θ +they 他们 她们 它们 +thick 厚 密 浓 +thief 小偷 盗贼 +thin 瘦 薄 +thing 事情 东西 +think 考虑 以为 思 想 +thirst 渴 +thirst 渴 渴望 +this 这个 这种 这样 这么 +thorough 充分 完全 彻底 +those 那些 +though 即使 虽然 +thousand 千 仟 +thresh 门槛 阈值 +throat 咙 咽喉 +through 全部 遍及 经过 通过 +throw 扔 扔掉 扔到 抛掷 +thrust 推入 +thumb 大姆指 +thunder 雷 打雷 +thus 于是 如此 +tibet 西藏 吐蕃 +ticket 车票 入场券 +tide 潮 潮流 时势 +tie 领带 +tiger 老虎 +tile 瓦砖 +till 直到 +timber 木材 +time 时间 +times 次 次数 +timid 懦怯 胆小 +tin 锡 +tiny 微小 +tip 小费 赏钱 小技巧 +tired 疲劳 +title 标题 头衔 +to 到 +toast 烤面包 +tobacco 烟草 +toe 脚趾 鞋尖 +toefl 托福 +tofu 豆腐 +together 一起 一块儿 +toggle 切换 +toil 辛苦 苦工 苦干 +token 纪念品 标记 表征 +tokyo 东京 +tolerate 容忍 +tomb 坟 墓 坟墓 +tomorrow 明天 +ton 吨 +tone 调 音调 色调 语调 音色 +tongue 舌头 +tonight 今晚 +too 太 +tool 工具 【实验器材】 +toomuch 太超过 太过分 +tooth 齿 牙齿 +toothpaste 牙膏 +top 顶 +tortoise 龟 乌龟 +toss 摇动 颠簸 +totem 图腾 标记 徽章 +touch 碰 接触 触摸 +tour 旅行 +toward 向着 对着 朝着 +towel 毛巾 +tower 塔 高耸 +town 市镇 +toy 玩具 +trace 足迹 线索 痕迹 +track 跑道 +trade 贸易 商业 买卖 +tradition 传统 +tragedy 悲剧 杯具 +train 火车 +training 训练 +transfer 传递 转换 +translate 翻译 +translator 翻译器 +transparent 透明 +trap 陷阱 +trash 垃圾 +travel 旅行 +traveler 游客 旅行者 +tray 托盘 盘子 +tread 蹂躏 +treasure 财宝 +treat 处理 对待 款待 +treatment 处理 待遇 治疗 +tree 树 +trellis 网格 +tremble 发抖 震动 +trend 潮流 趋势 趋向 倾向 动向 浪头 +triangle 三角形 +trick 诡计 骗术 +trigger 激活 触发 启动 扳机 +trip 旅行 +troop 军队 部队 +arms 武器 军火 军备 武装 兵器 +trouble 麻烦 烦恼 扰乱 +trouser 裤子 +truck 卡车 +true 真 真的 真正 真相 +trunk 树干 +trust 信用 +truth 真实 真理 真相 +try 试 试试 试一试 尝试 试图 +tsunami 海啸 +tube 筒 管 +tunnel 隧道 +turing 图灵 +turn 变化 转动 旋转 +turtle 龟 乌龟 +tv 电视 电视机 +twice 两倍 两次 +twig 树枝 +twin 孪生子 +twinkle 闪烁 +twitter 微博 微博客 推特 +type 类型 打字 +typewriter 打字机 +typical 典型 +typist 打字员 +ufo 不明飞行物 +uganda 乌干达 +ugly 丑 难看 +umbrella 伞 雨伞 +umpire 公正人 +uncle 舅舅 叔叔 伯伯 +under 之下 +understand 明白 了解 懂得 +unfortunate 不幸 倒霉 +unicode 统一码 万国码 国际代码标准 +uniform 制服 军服 +union 工会 结合 联盟 +unique 唯一 独特的 独一无二 +unite 团结 合一 统一 单位 +universe 普适 通用 +university 大学 +unknown 无名 未知 +unless 除非 +unsung 幕后 +unusual 不平常 稀有 +up 上 向上 起来 +update 更新 +upload 上载 +upper 上部 +upright 直立 笔直 老实 +upstairs 楼上 +upward 向上 +uranium 铀 +uruguay 乌拉圭 +urumqi 乌鲁木齐 +usa 美国 米国 美利坚合众国 +use 用 使用 采用 利用 +useful 有用的 +useless 没用 无益 +user 用户 玩家 +ussr 苏联 +usual 普通 通常 +utah 犹他 +utilize 利用 +utmost 极度 +utopia 乌托邦 桃花源 +utter 十足 完全 +uyghur 维吾尔 +vacation 假期 +vagina 阴户 +vain 空虚 虚荣 +valentine 情人节 +valid 有效的 +valley 流域 谷 +valuable 贵重 +value 价值 价格 定值 价钱 数值 +vapor 蒸气 烟雾 +various 各种 多样 +vary 变化 +vase 花瓶 +vast 广阔 +vegetable 蔬菜 植物 +veil 面纱 +vein 静脉 血管 叶脉 +venture 冒险 投机 +verb 动词 +verdict 定案 判决书 +verify 验证 +vermont 佛蒙特 +verse 诗句 韵文 +version 版本 +vertical 纵 +verticle 竖 垂直 绝顶 +very 非常 很 +vessel 容器 器皿 船只 +vest 背心 +veteran 老兵 +vibrate 振动 +vice 副 +victory 胜利 凯旋 +video 视频 录像 +view 风景 意见 见解 +vigra 威哥 威妹 伟哥 +village 村庄 乡 +violate 破坏 侵害 污辱 +violent 猛烈 暴力 +violin 小提琴 +virgin 处女 +virus 病毒 +visa 签证 +viscous 粘 粘的 粘性的 +visible 看得见 +visit 参观 访问 拜会 看望 +visitor 来客 游客 +voa 美国之音 +voice 声音 +volcano 火山 +volleyball 排球 +volume 体积 +volunteer 志愿者 +vomit 呕 +vote 投票 +vowel 元音 +voyage 航海 +vulgar 低俗 庸俗 媚俗 +wade 趟过 +wafer 晶圆 硅片 +wage 工资 薪水 +wagon 货车 +waist 腰 +wait 等候 等待 等一等 +waiter 服务员 +wake 醒 觉醒 觉悟 +walk 走 走路 散步 +wall 墙 被墙 墙壁 +wallstreet 华尔街 +wander 徘徊 流浪 +want 需要 +war 战 战争 +warm 温 暖 温暖 暖和 +warmful 热情的 +wash 洗 +washington 华盛顿 +waste 废物 浪费 荒废 +watch 监视 看守 手表 手錶 +water 水 +wave 动摇 波浪 +wax 蜡 +way 办法 方案 方式 方法 道路 +we 我们 +weak 有病 虚弱 +wealth 财富 +wear 疲乏 磨损 穿戴 +weather 天气 气候 +weave 织 +wedding 婚礼 +weep 哭泣 +weight 体重 重量 +welcome 欢迎 迎接 +well 好 井 +wet 湿 +whale 鲸 +what 什么 +whatever 什么都 无论 什么都 +wheat 小麦 +wheel 轮 毂 +when 何时 当 +whenever 随时 +where 哪里 何处 +whether 不管 +which 那一个 哪个 +whirl 旋转 旋涡 +whisper 耳语 私语 低语 +whistle 汽笛 吹口哨 +whitepaper 白皮书 +who 谁 +whoever 谁都 不管谁 +whole 全体 完全 统统 整个 +whore 婊子 妓女 娼妇 +whoredom 淫乱 +whose 谁的 +why 为什么 +wicked 邪恶 不正经 +wide 宽 宽阔 +widow 寡妇 +widower 鳏 +width 宽度 +wife 妻子 老婆 +wiki 维基 +wikileaks 维基揭密 +wikipedia 维基百科 +wild 粗野 荒芜 +will 将 遗嘱 +win 嬴 胜 +wind 风 +window 窗 窗户 窗口 +windows 微软视窗 +wine 葡萄酒 +wing 翅膀 +wink 眨眼 +wipe 抹 擦 +wire 电线 +wisconsin 威斯康星 +wisdom 智慧 +wish 愿望 祝愿 希望 +wither 枯萎 凋残 +within 以内 在内 +without 没有 不用 +wolf 狼 +woman 女人 妇女 我们 +women 妇女 +wonder 奇妙 可惊 惊讶 奇观 +wonderful 奇妙的 +wood 木 柴 +wooden 木制 +wool 羊毛 +word 字 词 +work 工作 劳动 +workaround 歪招 +worker 工人 工作者 +world 世界 +worldwar 世界大战 +worse 更坏 越来越坏 +worth 价值 +wound 负伤 伤害 +wow 哇 哇啦 魔兽世界 +wrath 愤怒 +wreath 花环 +wreck 失事 遭难 +wrist 手腕 +write 写 写作 +writer 作家 +wrong 错 错的 不对的 +wto 世界贸易组织 +www 互联网 网站 万维网 萬維網 +xag 白银 +xau 黄金 +yahoo 雅虎 +yale 耶鲁大学 +yam 红薯 +yard 院子 +yawn 打呵欠 +year 年 年岁 年龄 骨龄 +yell 叫喊 喊叫 呼叫 号叫 +yemen 也门 +yes 是的 +yesterday 昨天 +yet 还 仍然 +yield 供给 产 +yoga 瑜珈 +yosemite 优胜美地 国家公园 +you 你 妳 +yuga 瑜伽 +zebra 斑马 +zinc 锌 +zombie 僵尸 行尸走肉 +zone 区域 地带 +zoo 动物园 +zoology 动物学 diff --git a/plugin/vimim.vim b/plugin/vimim.vim new file mode 100644 index 00000000..73527508 --- /dev/null +++ b/plugin/vimim.vim @@ -0,0 +1,3199 @@ +" =========================================================== +" VimIM —— Vim 中文輸入法 +" =========================================================== +let s:egg = ' vimim easter egg:' " vim i vimim CTRL-^ CTRL-^ +let s:url = ' http://vimim.googlecode.com/svn/vimim/vimim.vim.html' +let s:url = ' http://code.google.com/p/vimim/source/list' +let s:url = ' http://vim.sf.net/scripts/script.php?script_id=2506' + +let s:VimIM = [" ==== introduction ==== {{{"] +" ================================================= +" File: vimim.vim +" Author: vimim +" License: GNU Lesser General Public License +" Readme: VimIM is a Vim plugin as an Input Method for i_CTRL-^ in Vim +" (1) do Chinese input without mode change: Midas touch +" (2) do Chinese search without typing Chinese: slash search +" (3) support Google/Baidu/Sogou/QQ cloud input +" (4) support bsd database with python interface to Vim +" PnP: Plug and Play +" (1) drop the vimim.vim to the plugin folder: plugin/vimim.vim +" (2) [option] drop supported datafiles, like: plugin/vimim.txt +" Usage: VimIM takes advantage of the definition from Vim +" (1) :help gi Insert text ... +" (2) :help n Repeat the latest '/' or '?' ... +" (3) :help i_CTRL-^ Toggle the use of language ... +" (4) :help i_CTRL-_ Switch between languages ... +" (5) :help i_CTRL-U Delete all entered characters ... (internal) +" (6) :help i_CTRL-L When ... is set: Go to ... mode ... (internal) + +" ============================================= }}} +let s:VimIM += [" ==== initialization ==== {{{"] +" ================================================= + +function! s:vimim_bare_bones_vimrc() + set cpoptions=Bce$ go=cirMehf shm=aoOstTAI noloadplugins + set gcr=a:blinkon0 shellslash noswapfile hlsearch viminfo= + set fencs=ucs-bom,utf8,chinese,gb18030 gfn=Courier_New:h12:w7 + set enc=utf8 gfw=YaHei_Consolas_Hybrid,NSimSun-18030 + let unix = '/usr/local/bin:/usr/bin:/bin:.' + let windows = '/bin/;/Python27;/Python31;/Windows/system32;.' + let $PATH = has("unix") ? unix : windows +endfunction + +if exists("g:vimim_profile") || &iminsert == 1 || v:version < 700 + finish +elseif &compatible + call s:vimim_bare_bones_vimrc() +endif +scriptencoding utf-8 +let g:vimim_profile = reltime() +let s:plugin = expand(":p:h") + +function! s:vimim_initialize_debug() + " gvim -u /var/mobile/vim/vimfiles/plugin/vimim.vim + " gvim -u /home/vimim/svn/vimim/trunk/plugin/vimim.vim + let s:plugon = simplify(s:plugin . '/../../../hjkl/') + if empty(&cp) && exists('s:plugon') && isdirectory(s:plugon) + let g:vimim_map = 'tab_as_gi' + let g:vimim_cloud = 'google,sogou,baidu,qq' + endif +endfunction + +function! s:vimim_initialize_backdoor() + let s:titlestring = &titlestring + let s:cjk = { 'lines' : [] } + let s:english = { 'lines' : [], 'line' : "" } + let s:cjk.filename = s:vimim_filereadable("vimim.cjk.txt") + let s:english.filename = s:vimim_filereadable("vimim.txt") + let s:mandarin = len(s:english.filename) ? 0 : 1 " s/t chinese style + let s:hit_and_run = len(s:cjk.filename) ? 0 : 1 " onekey continuity + if len(s:cjk.filename) + highlight! PmenuSbar NONE + highlight! PmenuThumb NONE + highlight! Pmenu NONE + highlight! link PmenuSel NonText + endif +endfunction + +function! s:vimim_debug(...) + " [.vimrc] :redir @+>> + " [client] :sil!call s:vimim_debug(s:vimim_egg_vimim()) + sil!echo "\n::::::::::::::::::::::::" + if len(a:000) > 1 + sil!echo join(a:000, " :: ") + elseif type(a:1) == type({}) + for key in keys(a:1) + sil!echo key . '::' . a:1[key] + endfor + elseif type(a:1) == type([]) + for line in a:1 + sil!echo line + endfor + else + sil!echo string(a:1) + endif + sil!echo "::::::::::::::::::::::::\n" +endfunction + +function! s:vimim_initialize_global() + highlight default lCursorIM guifg=NONE guibg=green gui=NONE + highlight! link lCursor lCursorIM + let s:space = ' ' + let s:colon = ':' + let g:vimim = "VimIM 中文輸入法" + let s:windowless_title = "VimIM" + let s:today = s:vimim_imode_today_now('itoday') + let s:multibyte = &encoding =~ "utf-8" ? 3 : 2 + let s:localization = &encoding =~ "utf-8" ? 0 : 2 + let s:seamless_positions = [] + let s:starts = { 'row' : 0, 'column' : 1 } + let s:quanpin_table = {} + let s:shuangpin_table = {} + let s:http_exe = "" + let s:shuangpin = 'abc ms plusplus purple flypy nature' + let s:abcd = split("'abcdvfgxz", '\zs') + let s:qwer = split("pqwertyuio", '\zs') + let s:az_list = map(range(97,122),"nr2char(".'v:val'.")") + let s:valid_keys = s:az_list + let s:valid_keyboard = "[0-9a-z']" + let s:valid_wubi_keyboard = "[0-9a-z]" + let s:shengmu_list = split('b p m f d t l n g k h j q x r z c s y w') + let s:pumheights = { 'current' : &pumheight, 'saved' : &pumheight } + let s:smart_quotes = { 'single' : 1, 'double' : 1 } + let s:backend = { 'cloud' : {}, 'datafile' : {}, 'directory' : {} } + let s:ui = { 'root' : '', 'im' : '', 'quote' : 0, 'frontends' : [] } + let s:rc = {} + let s:rc["g:vimim_mode"] = 'dynamic' + let s:rc["g:vimim_shuangpin"] = 0 + let s:rc["g:vimim_map"] = '' + let s:rc["g:vimim_toggle"] = 0 + let s:rc["g:vimim_cloud"] = 'baidu,sogou,qq,google' + let s:rc["g:vimim_mycloud"] = 0 + let s:rc["g:vimim_plugin"] = s:plugin + let s:rc["g:vimim_punctuation"] = 2 + call s:vimim_set_global_default() + let s:plugin = isdirectory(g:vimim_plugin) ? g:vimim_plugin : s:plugin + let s:plugin = s:plugin[-1:] != "/" ? s:plugin."/" : s:plugin + let s:dynamic = {'onekey':0,'windowless':0,'dynamic':1,'static':0} + let s:static = {'onekey':0,'windowless':0,'dynamic':0,'static':1} + let s:onekey = {'onekey':1,'windowless':0,'dynamic':0,'static':0} + let s:windowless = {'onekey':0,'windowless':1,'dynamic':0,'static':0} +endfunction + +function! s:vimim_dictionary_keycodes() + let s:keycodes = {} + let cloud = ' google sogou baidu qq mycloud ' + for key in split( cloud . ' pinyin ') + let s:keycodes[key] = "['a-z0-9]" + endfor + for key in split('array30 phonetic') + let s:keycodes[key] = "[.,a-z0-9;/]" + endfor + for key in split('zhengma taijima wubi cangjie hangul xinhua quick') + let s:keycodes[key] = "['a-z]" + endfor + let s:keycodes.wu = "['a-z]" " s:ui.quote=1 + let s:keycodes.nature = "['a-z]" " s:ui.quote=1 + let s:keycodes.yong = "['a-z.;/]" " s:ui.quote=1 + let s:keycodes.erbi = "['a-z.;/,]" " s:ui.quote=1 + let s:keycodes.boshiamy = "['a-z.],[]" " s:ui.quote=1 + let ime = ' pinyin_sogou pinyin_quote_sogou pinyin_huge' + let ime .= ' pinyin_fcitx pinyin_canton pinyin_hongkong' + let ime .= ' wubi98 wubi2000 wubijd wubihf' + let s:all_vimim_input_methods = keys(s:keycodes) + split(ime) +endfunction + +function! s:vimim_set_frontend() + let quote = 'erbi wu nature yong boshiamy' " quote in datafile + let cloud = get(split(g:vimim_cloud,','), 0) " default cloud + let s:valid_keyboard = "[0-9a-z']" + if !empty(s:ui.root) && empty(g:vimim_shuangpin) + let s:valid_keyboard = s:backend[s:ui.root][s:ui.im].keycode + elseif g:vimim_shuangpin == 'ms' || g:vimim_shuangpin == 'purple' + let s:valid_keyboard = "[0-9a-z';]" + endif + let i = 0 + let keycode_string = "" + while i < 16*16 + if nr2char(i) =~# s:valid_keyboard + let keycode_string .= nr2char(i) + endif + let i += 1 + endwhile + let s:valid_keys = split(keycode_string, '\zs') + let s:wubi = cloud =~ 'wubi' || s:ui.im =~ 'wubi\|erbi' ? 1 : 0 + let s:ui.quote = match(split(quote),s:ui.im) < 0 ? 0 : 1 + let s:gi_dynamic = s:ui.im =~ 'pinyin' || s:ui.root =~ 'cloud' ? 0 : 1 + let logo = s:chinese('dscj') + let tail = s:mode.windowless ? s:today : '' + if s:mode.dynamic || s:mode.static + let logo = s:chinese('chinese',s:mode.static?'static':'dynamic') + let tail = s:chinese('halfwidth') + if g:vimim_punctuation > 0 && s:toggle_punctuation > 0 + let tail = s:chinese('fullwidth') + endif + endif + let g:vimim = "VimIM".s:space.logo.' '.s:vimim_im_chinese().' '.tail + call s:vimim_set_title(g:vimim) +endfunction + +function! s:vimim_set_global_default() + let s:vimimrc = [] + let s:vimimdefaults = [] + for variable in keys(s:rc) + if exists(variable) + let value = string(eval(variable)) + let vimimrc = ':let ' . variable .' = '. value .' ' + call add(s:vimimrc, ' ' . vimimrc) + else + let value = string(s:rc[variable]) + let vimimrc = ':let ' . variable .' = '. value .' ' + call add(s:vimimdefaults, ' " ' . vimimrc) + endif + exe 'let '. variable .'='. value + endfor +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== easter eggs ==== {{{"] +" ================================================= + +function! s:vimim_easter_chicken(keyboard) + try + return eval("s:vimim_egg_" . a:keyboard . "()") + catch + sil!call s:vimim_debug('egg', a:keyboard, v:exception) + endtry + return [] +endfunction + +function! s:vimim_egg_vimimhelp() + let eggs = split(s:url) + let eggs += [''] + s:vimim_egg_vim() + let eggs += [''] + s:vimim_egg_vimimgame() + let eggs += [''] + s:vimim_egg_vimim() + let eggs += [''] + s:vimim_egg_vimimvim() + return map(eggs, 'v:val . " "') +endfunction + +function! s:vimim_egg_vim() + return ["Vim  文本編輯器", g:vimim] +endfunction + +function! s:vimim_egg_vimimgame() + let mahjong = "春夏秋冬 梅兰竹菊 中發白囍 東南西北" + return split(mahjong) +endfunction + +function! s:vimim_egg_vimimvim() + let vimim_pprint_filter = "strpart(" . 'v:val' . ", 0, 29)" + return map(copy(s:VimIM), vimim_pprint_filter) +endfunction + +function! s:vimim_egg_vimimrc() + let vimim = s:vimimdefaults + s:vimimrc + if g:vimim_toggle > -1 " update g:vimim_toggle if not closed + let filter = "get(" . 'v:val' . ",1)" + let g:vimim_toggle = join(map(copy(s:ui.frontends),filter),",") + let toggle = match(vimim, 'g:vimim_toggle') + let left = vimim[toggle][0 : 1 + match(vimim[toggle], '=')] + let vimim[toggle] = left . string(g:vimim_toggle) + endif + return sort(vimim) +endfunction + +function! s:vimim_egg_vimim() + let eggs = [] + call add(eggs, s:chinese('date', s:colon) . s:today) + let os = "win32unix win32 win64 macunix unix x11" + for computer in split(os) + if has(computer) | let os = computer | break | endif + endfor + let time = reltimestr(g:vimim_profile) . ' seconds' + call add(eggs, s:chinese('computer', s:colon) . os . time) + let revision = v:progname ."=". v:version + call add(eggs, s:chinese('revision', s:colon) . revision) + let encoding = s:chinese('encoding', s:colon) . &encoding + call add(eggs, encoding . s:space . &fileencodings) + call add(eggs, s:chinese('env', s:colon) . v:lc_time) + let db = s:chinese('database', s:colon) + let input = "VimIM" . s:space . s:vimim_im_chinese() . s:space + if len(s:cjk.filename) + let input .= s:chinese('4corner') . s:space + call add(eggs, db.s:chinese('cjk',s:colon).s:cjk.filename) + endif + if len(s:english.filename) + let input .= s:chinese('english') . s:space + call add(eggs, db.s:chinese('english').db.s:english.filename) + endif + let cloud = db . s:chinese('cloud') . db + for [root, im] in s:ui.frontends + let backend = s:backend[root][im] + if root == "cloud" + let cloud .= backend.name . s:chinese('cloud') . s:space + else + call add(eggs, db . backend.chinese . db . backend.name) + endif + endfor + let exe = s:http_exe =~ 'Python' ? '' : "HTTP executable: " + call add(eggs, cloud) + call add(eggs, s:chinese('network', s:colon) . exe . s:http_exe) + call add(eggs, s:chinese('input', s:colon) . input) + call add(eggs, s:chinese('option', s:colon) . 'vimimrc') + let results = map(eggs + s:vimim_egg_vimimrc(), 'v:val . " " ') + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== hjkl vimimgame ==== {{{"] +" ================================================= + +function! s:vimim_cache() + let results = [] + if !empty(s:pageup_pagedown) + let length = len(s:match_list) + if length > &pumheight + let page = s:pageup_pagedown * &pumheight + let partition = page ? page : length+page + let B = s:match_list[partition :] + let A = s:match_list[: partition-1] + let results = B + A + endif + elseif s:touch_me_not + if s:hjkl_h | let s:hjkl_h = 0 + for line in s:match_list + let oneline = join(reverse(split(line,'\zs')),'') + call add(results, oneline) + endfor + elseif s:hjkl_l | let s:hjkl_l = 0 + let results = reverse(copy(s:match_list)) + endif + endif + return results +endfunction + +function! s:vimim_get_hjkl_game(keyboard) + let keyboard = a:keyboard + let results = [] + let poem = s:vimim_filereadable(keyboard) + if keyboard =~# '^i' && keyboard =~ '\d' && empty(g:vimim_shuangpin) + return s:vimim_imode_number(keyboard) + elseif keyboard ==# 'itoday' || keyboard ==# 'inow' + return [s:vimim_imode_today_now(keyboard)] + elseif keyboard == "''''''" + return split(join(s:vimim_egg_vimimgame(),""),'\zs') + elseif s:vimim_get_unicode_ddddd(keyboard) + return s:vimim_unicode_list(s:vimim_get_unicode_ddddd(keyboard)) + elseif keyboard == "''" + let before = '' " get one chinese char before + if !empty(len(s:vimim_left())) + let before = getline(".")[col(".")-1-s:multibyte : col(".")-2] + endif + if empty(before) || before !~ '[^\x00-\xff]' + if s:vimim_cjk() | return s:vimim_cjk_match('u') | endif + let before = nr2char(19968) " the 214 standard unicode index + endif " gi ,.. space ,.. space + return s:vimim_unicode_list(char2nr(before)) + elseif !empty(poem) + let results = s:vimim_readfile(poem) " [hjkl] file in hjkl folder + elseif keyboard ==# "vim" || keyboard =~# "^vimim" + let results = s:vimim_easter_chicken(keyboard) " [hidden] egg + elseif keyboard =~# '\l\+' . "'" . '\{4}$' + let results = s:vimim_get_all_clouds(keyboard[:-5]) " fuck'''' + elseif len(getreg('"')) > 3 + if keyboard == "''''" " visual: display buffer inside omni + let results = split(getreg('"'), '\n') + elseif keyboard =~ "'''''" " visual: display one-line-cjk property + let line = substitute(getreg('"'),'[\x00-\xff]','','g') + if len(line) + for chinese in split(line, '\zs') + let menu = s:vimim_cjk_property(chinese) + let menu .= repeat(" ", 38-len(menu)) + call add(results, chinese . " " . menu) + endfor + endif + endif + endif + if len(results) + let s:touch_me_not = 1 + if s:hjkl_m % 4 + for i in range(s:hjkl_m % 4) + let results = s:vimim_hjkl_rotation(results) + endfor + endif + let results = [s:space] + results + [s:space] + endif + return results +endfunction + +function! s:vimim_hjkl_rotation(lines) + let max = max(map(copy(a:lines), 'strlen(v:val)')) + 1 + let multibyte = match(a:lines,'\w') < 0 ? s:multibyte : 1 + let results = [] + let rotations = [] + for line in a:lines + let spaces = '' " rotation makes more sense for cjk + if (max-len(line)) / multibyte + for i in range((max-len(line))/multibyte) + let spaces .= s:space + endfor + endif + let line .= spaces + call add(rotations, line) + endfor + for i in range(max/multibyte) + let column = '' + for line in reverse(copy(rotations)) + let line = get(split(line,'\zs'), i) + if !empty(line) | let column .= line | endif + endfor + call add(results, column) + endfor + return results +endfunction + +function! s:vimim_chinese_rotation() range abort + :%s#\s*\r\=$## + :let lines = getline(a:firstline, a:lastline) + :let lines = s:vimim_hjkl_rotation(lines) + :%d + :for line in lines | put=line | endfor +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== user interface ==== {{{"] +" ================================================= + +function! s:vimim_dictionary_statusline() + let one = " dscj wubi2000 taijima 4corner boshiamy input cjk nature" + let two = " 点石成金,點石成金 新世纪,新世紀 太极码,太極碼" + let two .= " 四角号码,四角號碼 呒虾米,嘸蝦米 输入,輸入" + let two .= " 标准字库,標準字庫 自然码,自然碼" + let one .= " computer database option flypy network cloud env " + let one .= " encoding ms static dynamic erbi wubi hangul xinhua" + let one .= " zhengma cangjie yong wu wubijd shuangpin" + let two .= " 电脑,電腦 词库,詞庫 选项,選項 小鹤,小鶴 联网,聯網 云,雲 " + let two .= " 环境,環境 编码,編碼 微软,微軟 静态,靜態 动态,動態" + let two .= " 二笔,二筆 五笔,五筆 韩文,韓文 新华,新華 郑码,鄭碼" + let two .= " 仓颉,倉頡 永码,永碼 吴语,吳語 极点,極點 双拼,雙拼" + let one .= " hit fullwidth halfwidth english chinese purple plusplus" + let one .= " quick wubihf mycloud wubi98 pin pinyin phonetic array30" + let one .= " abc revision date google baidu sogou qq " + let two .= " 打 全角 半角 英文 中文 紫光 加加 速成 海峰 自己的 98" + let two .= " 拼 拼音 注音 行列 智能 版本 日期 谷歌 百度 搜狗 QQ" + let s:chinese_statusline = s:vimim_key_value_hash(one, two) +endfunction + +function! s:vimim_dictionary_punctuations() + let s:antonym = " 〖〗 () 《》 【】 ‘’ “”" + let one = " { } ( ) < > [ ] " + let two = join(split(join(split(s:antonym)[:3],''),'\zs')) + let antonyms = s:vimim_key_value_hash(one, two) + let one = " , . + - ~ ^ _ " + let two = " , 。 + - ~ …… —— " + let mini_punctuations = s:vimim_key_value_hash(one, two) + let one = " @ : # & % $ ! = ; ? * " + let two = "   : # & % ¥ ! = ; ? ﹡" + let most_punctuations = s:vimim_key_value_hash(one, two) + call extend(most_punctuations, antonyms) + let s:key_evils = { '\' : "、", "'" : "‘’", '"' : "“”" } + let s:all_evils = {} " all punctuations for onekey_evils + call extend(s:all_evils, mini_punctuations) + call extend(s:all_evils, most_punctuations) + let s:punctuations = {} + if g:vimim_punctuation > 0 " :let g:vimim_punctuation = 1 + call extend(s:punctuations, mini_punctuations) + endif + if g:vimim_punctuation > 1 " :let g:vimim_punctuation = 2 + call extend(s:punctuations, most_punctuations) + endif +endfunction + +function! g:vimim_slash() + let range = col(".") - 1 - s:starts.column + let chinese = strpart(getline("."), s:starts.column, range) + let word = substitute(chinese,'\w','','g') + let @/ = empty(word) ? @_ : word + let repeat_times = len(word) / s:multibyte + let key = repeat("\\",repeat_times) . g:vimim_esc() + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_bracket(offset) + let cursor = "" + let range = col(".") - 1 - s:starts.column + let repeat_times = range / s:multibyte + a:offset + if repeat_times + let cursor = repeat("\\", repeat_times) + elseif repeat_times < 1 + let cursor = strpart(getline("."), s:starts.column, s:multibyte) + endif + return cursor +endfunction + +function! s:vimim_get_label(label) + let labeling = a:label == 10 ? "0" : a:label + if s:mode.onekey && a:label < 11 + let label2 = a:label < 2 ? "_" : get(s:abcd,a:label-1) + let labeling = empty(labeling) ? '10' : labeling . label2 + if len(s:cjk.filename) && empty(s:hjkl_l%2) + let labeling = " " . label2 + endif + endif + return labeling +endfunction + +function! s:vimim_set_pumheight() + let &completeopt = s:mode.windowless ? 'menu' : 'menuone' + let &pumheight = s:pumheights.saved + if empty(&pumheight) + let &pumheight = 5 + if s:mode.onekey || len(s:valid_keys) > 28 + let &pumheight = 10 + endif + endif + let &pumheight = s:mode.windowless ? 1 : &pumheight + let s:pumheights.current = copy(&pumheight) + if s:touch_me_not + let &pumheight = 0 + elseif s:hjkl_l + let &pumheight = s:hjkl_l % 2 ? 0 : s:pumheights.current + endif +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== statusline ==== {{{"] +" ================================================= + +function! s:vimim_set_title(title) + if &laststatus < 2 + let &titlestring = a:title + redraw + endif + if &term == 'screen' + if s:mode.windowless + let &l:statusline = '%{"'. a:title .'"}%<' + else + let &l:statusline = g:vimim .' %h%m%r%=%-14.(%l,%c%V%) %P %<%f' + endif + endif +endfunction + +function! s:vimim_im_chinese() + if empty(s:ui.im) + return "==broken python interface to vim==" + endif + let backend = s:backend[s:ui.root][s:ui.im] + let title = has_key(s:keycodes, s:ui.im) ? backend.chinese : '' + if s:ui.im =~ 'wubi' + for wubi in split('wubi98 wubi2000 wubijd wubihf') + if get(split(backend.name, '/'),-1) =~ wubi + let title .= s:chinese(wubi) + endif + endfor + elseif s:ui.im == 'mycloud' + let title .= s:chinese('cloud', s:space) + let title .= s:backend.cloud.mycloud.directory + elseif s:ui.root == 'cloud' + let title = s:chinese(s:space, s:cloud, 'cloud') + let clouds = split(g:vimim_cloud,',') + let vimim_cloud = get(clouds, match(clouds, s:cloud)) + if vimim_cloud =~ 'wubi' " g:vimim_cloud='qq.wubi' + let title .= s:chinese(s:space, 'wubi') + elseif vimim_cloud =~ 'shuangpin' " qq.shuangpin.ms => ms + let shuangpin = get(split(vimim_cloud,"[.]"),-1) + if match(split(s:shuangpin),shuangpin) > -1 + let title .= s:chinese(s:space, shuangpin, 'shuangpin') + endif + endif + endif + if !empty(g:vimim_shuangpin) + let title = s:chinese(s:space, g:vimim_shuangpin, 'shuangpin') + endif + if g:vimim_shuangpin =~ 'abc' || g:vimim_cloud =~ 'abc' + let title = substitute(title,s:chinese('pin'),s:chinese('hit'),'') + endif + return title +endfunction + +function! s:vimim_windowless_titlestring(cursor) + let logo = "VimIM" + let west = s:all_evils['['] + let east = s:all_evils[']'] + let title = substitute(s:windowless_title, west.'\|'.east, ' ', 'g') + if title !~ '\s\+' . "'" . '\+\s\+' + let title = substitute(title,"'",'','g') + endif + let title = substitute(title, '\s\*\=\d\=\s', ' ', '') + let words = split(title)[1:] + let cursor = s:cursor_at_windowless + a:cursor + let hightlight = get(words, cursor) + if !empty(hightlight) && len(words) > 1 + let west = join(words[1 : cursor-1]) . west + let east .= join(words[cursor+1 :]) + let s:cursor_at_windowless = cursor + let keyboard = get(words,0)=='0' ? "" : get(words,0) + let star = len(s:hjkl) ? s:hjkl : len(s:english.line) ? '*' : '' + if empty(s:mode.windowless) || empty(s:cjk.filename) + let logo .= s:space . s:vimim_im_chinese() + endif + let logo .= ' '. keyboard .' '. star . west . hightlight . east + endif + sil!call s:vimim_set_title(logo) +endfunction + +function! g:vimim_esc() + let key = nr2char(27) " is if onekey or windowless + if s:mode.windowless || s:mode.onekey + if has("gui_running") + sil!let @+ = getline(".") " to clipboard + endif + sil!let key = s:vimim_stop() . key " to escape + sil!call s:vimim_set_title(s:space . getline(".")) + elseif pumvisible() + let key = g:vimim_one_key_correction() " as correction + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== lmap imap nmap ==== {{{"] +" ================================================= + +function! g:vimim_cycle_vimim() + if len(s:cjk.filename) " backdoor to cycle all 4 vimim modes + let s:mode = s:mode.windowless ? s:onekey : + \ s:mode.onekey ? s:dynamic : + \ s:mode.dynamic ? s:static : s:windowless + elseif s:mode.onekey || s:mode.windowless + let s:mode = s:mode.onekey ? s:windowless : s:onekey + elseif s:mode.static || s:mode.dynamic + let s:toggle_punctuation = (s:toggle_punctuation + 1) % 2 + endif + let s:hit_and_run = 0 + sil!call s:vimim_set_frontend() + sil!call s:vimim_set_keyboard_maps() + return "" +endfunction + +function! g:vimim_label(key) + let key = a:key + if pumvisible() + let n = match(s:abcd, key) + if key =~ '\d' + let n = key < 1 ? 9 : key - 1 + endif + let yes = repeat("\", n). '\' + let omni = '\=g:vimim()\' + if s:mode.onekey + if s:vimim_cjk() && a:key =~ '\d' + let s:hjkl .= a:key " 1234567890 as filter + let yes = '' + elseif s:hit_and_run || a:key =~ '\d' + let omni = s:vimim_stop() + endif + endif + if len(yes) + sil!call s:vimim_reset_after_insert() + endif + let key = yes . omni + elseif s:mode.windowless && key =~ '\d' + let key = s:vimim_windowless(key) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_page(key) + let key = a:key + if pumvisible() + let page = '\\=g:vimim()\' + if key =~ '[][]' + let left = key == "]" ? "\" : "" + let right = key == "]" ? "\" : "" + let _ = key == "]" ? 0 : -1 + let backspace = '\=g:vimim_bracket('._.')\' + let key = '\' . left . backspace . right + elseif key =~ '[=.]' + let s:pageup_pagedown = &pumheight ? 1 : 0 + let key = &pumheight ? page : '\' + elseif key =~ '[-,]' + let s:pageup_pagedown = &pumheight ? -1 : 0 + let key = &pumheight ? page : '\' + endif + elseif key =~ "[][=-]" && empty(s:mode.onekey) + let key = g:punctuation(key) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:wubi() + if s:gi_dynamic_on + let s:gi_dynamic_on = 0 | return "" + endif + let key = pumvisible() || s:mode.windowless && s:omni ? '\' : "" + if s:wubi && empty(len(get(split(s:keyboard),0))%4) + let key = pumvisible() ? '\' : s:mode.windowless ? "" : key + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_hjkl(key) + let key = a:key + if pumvisible() + if key ==# 'n' | call s:vimim_reset_after_insert() + elseif key ==# 'm' | let s:hjkl_m += 1 + elseif key ==# 'h' | let s:hjkl_h += 1 " h + elseif key ==# 'j' | let key = '\' " j + elseif key ==# 'k' | let key = '\' " k + elseif key ==# 'l' | let s:hjkl_l += 1 " l + elseif key ==# 's' | let s:hjkl__ += 1 " s/t transfer + elseif key =~ "[/?]" + let key = '\\=g:vimim_slash()\' . key . '\' + elseif match(s:qwer, key) > -1 + let s:hjkl .= match(s:qwer, key) + endif + let key = key == a:key ? '\=g:vimim()\' : key + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_punctuation_maps() + for _ in keys(s:all_evils) + if _ !~ s:valid_keyboard + exe 'lnoremap '._.' g:punctuation("'._.'")' + endif + endfor + if empty(s:ui.quote) + lnoremap ' =g:vimim_single_quote() + endif + if g:vimim_punctuation == 3 + lnoremap " =g:vimim_double_quote() + lnoremap =g:vimim_bslash() + endif +endfunction + +function! g:punctuation(key) + let key = a:key + if s:toggle_punctuation > 0 + if pumvisible() || getline(".")[col(".")-2] !~ '\w' + if has_key(s:punctuations, a:key) + let key = s:punctuations[a:key] + endif + endif + endif + if pumvisible() " the 2nd choice + let key = a:key == ";" ? '\\' : '\' . key + elseif s:mode.windowless && s:gi_dynamic + let key = a:key == ";" ? '\' : key + call g:vimim_space() + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_single_quote() + let key = "'" + if pumvisible() " the 3rd choice + let key = '\\\' + elseif s:mode.windowless && s:gi_dynamic + let key = '\\' + call g:vimim_space() + elseif g:vimim_punctuation < 3 + return key + elseif s:toggle_punctuation > 0 + let pairs = split(s:key_evils[key], '\zs') + let s:smart_quotes.single += 1 + let key = get(pairs, s:smart_quotes.single % 2) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_double_quote() + let key = '"' + if s:toggle_punctuation > 0 + let pairs = split(s:key_evils[key], '\zs') + let s:smart_quotes.double += 1 + let yes = pumvisible() ? '\' : "" + let key = yes . get(pairs, s:smart_quotes.double % 2) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_bslash() + let key = '\' + if s:toggle_punctuation > 0 + let yes = pumvisible() ? '\' : "" + let key = yes . s:key_evils[key] + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== mode: windowless ==== {{{"] +" ================================================= + +function! g:vimim_gi() + let s:mode = s:windowless + let key = s:vimim_start() + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_tab(gi) + " (1) Tab in insert mode => start Tab or windowless/onekey + " (2) Tab in pumvisible => print out menu + let key = "\t" + if empty(len(s:vimim_left())) + elseif pumvisible() || s:ctrl6 + let @0 = getline(".") " undo if dump out by accident + let key = s:vimim_screenshot() + else + let s:mode = a:gi? s:windowless : s:onekey + let key = s:vimim_start() . s:vimim_onekey_action() + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_windowless(key) + " workaround to test if active completion + let key = a:key " gi \bslash space space + if s:pattern_not_found " gi ma space xj space ctrl+u space + elseif s:vimim_left() && s:keyboard !~ ' ' " gi mmm.. space 7 space + elseif s:omni " assume completion active + let key = len(a:key) ? '\\=g:vimim()\' : '\' + let cursor = empty(len(a:key)) ? 1 : a:key < 1 ? 9 : a:key-1 + if s:vimim_cjk() " gi ma space isw8ql + let s:hjkl .= a:key " 1234567890 for windowless filter + else " 234567890 for windowless choice + let key = a:key =~ '[02-9]' ? repeat('\', cursor) : key + endif + call s:vimim_windowless_titlestring(cursor) + else + call s:vimim_set_title(g:vimim) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_pagedown() + let key = ' ' + if pumvisible() + let s:pageup_pagedown = &pumheight ? 1 : 0 + let key = &pumheight ? g:vimim() : '\' + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_space() + " (1) Space after English (valid keys) => trigger keycode menu + " (2) Space after omni popup menu => insert Chinese + " (3) Space after pattern not found => Space + " (4) Space after chinese windowless => for next match + " (5) Space after chinese windowless wubi => deactive completion + let key = " " + if pumvisible() + let key = '\=g:vimim()\' + if s:mode.onekey && s:hit_and_run + let key = s:vimim_stop() + endif + let cursor = s:mode.static ? '\\' : '' + let key = cursor . '\' . key + elseif s:pattern_not_found + elseif s:mode.dynamic + elseif s:mode.static + let key = s:vimim_left() ? g:vimim() : key + elseif s:seamless_positions == getpos(".") " gi ma space enter space + let s:smart_enter = 0 " Space is Space after Enter + elseif s:mode.windowless && s:gi_dynamic + let key = '' " gi m space (the 1st choice) + let s:gi_dynamic_on = 1 " gi m ; (the 2nd choice) + call s:vimim_set_title(g:vimim) " gi m ' (the 3rd choice) + else + let key = s:vimim_onekey_action() + endif + call s:vimim_reset_after_insert() + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_enter() + let s:omni = 0 + let key = "" + if pumvisible() + let key = "\" + let s:smart_enter = 1 " single Enter after English => seamless + elseif s:vimim_left() || s:mode.windowless + let s:smart_enter = 1 " gi ma space enter space space + if s:seamless_positions == getpos(".") + let s:smart_enter += 1 + endif + else + let s:smart_enter = 0 + endif + if s:smart_enter == 1 + let s:seamless_positions = getpos(".") + else + let key = "\" " Enter is Enter after Enter + let s:smart_enter = 0 + endif + sil!call s:vimim_set_title(g:vimim) + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_one_key_correction() + " :help i_CTRL-U Delete all entered characters ... + let key = nr2char(21) + if s:mode.windowless || s:mode.static && pumvisible() + if s:omni " one_key_correction " gi m space a space ctrl+u + let s:omni = -1 " gi mamahuhu space ctrl+u ctrl+u + let key = '\\=g:vimim()\\\' + endif + elseif pumvisible() + let range = col(".") - 1 - s:starts.column + let key = '\' . repeat("\\", range) + endif + sil!call s:vimim_reset_after_insert() + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:vimim_backspace() + " has special meaning in all 3 states of popupmenu-completion + let s:omni = 0 " disable active omni completion state + let key = pumvisible() ? '\=g:vimim()\' : '' + let key = '\\' . key + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_screenshot() + let keyboard = get(split(s:keyboard),0) + let space = repeat(" ", virtcol(".")-len(keyboard)-1) + if s:keyboard =~ '^vim' + let space = "" " no need to format if it is egg + elseif !empty(s:keyboard) + call setline(".", keyboard) + endif + let saved_position = getpos(".") + for items in s:popup_list + let line = printf('%s', items.word) + if has_key(items, "abbr") + let line = printf('%s', items.abbr) + if has_key(items, "menu") + let line = printf('%s %s', items.abbr, items.menu) + endif + endif + put=space.line + endfor + call setpos(".", saved_position) + let key = g:vimim_esc() + sil!exe 'sil!return "' . key . '"' +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== mode: onekey ==== {{{"] +" ================================================= + +function! g:vimim_onekey() + " (1) OneKey in insert mode => start omni popup mode + " (2) OneKey in onekey mode => close omni popup mode + " (3) OneKey in chinese mode => switch to the next im + " (4) OneKey in pumvisible => print out menu + let key = '' + if pumvisible() + let key = s:vimim_screenshot() + elseif empty(s:ctrl6) + let key = s:vimim_start() . s:vimim_onekey_action() + elseif s:mode.onekey + let key = s:vimim_stop() + else + let s:toggle_im += 1 + let switch = s:toggle_im % len(s:ui.frontends) + let s:ui.root = get(get(s:ui.frontends, switch), 0) + let s:ui.im = get(get(s:ui.frontends, switch), 1) + if s:ui.root == 'cloud' && s:ui.im != 'mycloud' + let s:cloud = s:ui.im + endif + let key = s:vimim_start() + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_onekey_action() + let s:hjkl = "" + let key = s:vimim_onekey_evils() + if empty(key) + if s:vimim_left() + let key = g:vimim() + elseif s:mode.windowless + let key = s:vimim_windowless("") + endif + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_onekey_evils() + let key = "" " punctuations can be made not so evil .. + let one = getline(".")[col(".")-2] " one byte before + let two = getline(".")[col(".")-3] " two byte before + let onekey_evils = copy(s:all_evils) + call extend(onekey_evils, s:key_evils) + if getline(".")[col(".")-3 : col(".")-2] == ".." " before_before + " [game] dot dot => quotes => popup menu + let three = getline(".")[col(".")-4] + if col(".") < 5 || empty(three) || three =~ '\s' + let key = "''''''" " <= .. plays mahjong + elseif three =~# "[0-9a-z]" + let key = "'''" " <= xx.. plays hjkl_m + else + let key = "''" " <= 香.. plays same cjk + endif + let key = "\\" . key . '\=g:vimim()\' + elseif one == "'" && two =~ "[a-z']" " force cloud + elseif one =~# "[0-9a-z]" || one =~# '\s' || empty(one) + elseif two =~# "[0-9a-z]" || one =~# '\u' + let key = " " " ma,space => ma, space + elseif has_key(onekey_evils, one) + for char in keys(onekey_evils) + if two ==# char || two =~# '\u' + return " " " no transfer if punctuation punctuation + endif + endfor + let bs = onekey_evils[one] " make Chinese punctuation + if one == '"' || one == '"' + let bs .= '\' + endif + let key = "\\" . bs + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_get_no_quote_head(keyboard) + let keyboard = a:keyboard + if keyboard =~ '\d' || s:ui.root == 'cloud' + return keyboard + endif + if s:hjkl_m && s:hjkl_m % 2 || keyboard =~ '^\l\l\+'."'''".'$' + " [shoupin] hjkl_m || sssss.. => sssss''' => s's's's's + let keyboard = substitute(keyboard, "'", "", 'g') + let keyboard = join(split(keyboard,'\zs'), "'") + endif + if keyboard =~ "'" && keyboard[-1:] != "'" + " [quote_by_quote] wo'you'yi'ge'meng + let keyboards = split(keyboard,"'") + let keyboard = get(keyboards,0) + let tail = join(keyboards[1:],"'") + let tail = len(tail) == 1 ? "'" . tail : tail + let s:keyboard = keyboard . " " . tail + endif + return keyboard +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== mode: chinese ==== {{{"] +" ================================================= + +function! g:vimim_chinese() + let s:mode = g:vimim_mode =~ 'static' ? s:static : s:dynamic + let s:switch = empty(s:ui.frontends) ? -1 : s:switch ? 0 : 1 + return s:switch<0 ? "" : s:switch ? s:vimim_start() : s:vimim_stop() +endfunction + +function! s:vimim_set_keyboard_maps() + let common_punctuations = split("] [ = -") + let common_labels = s:ui.im =~ 'phonetic' ? [] : range(10) + let s:gi_dynamic = s:mode.windowless ? s:gi_dynamic : 0 + let both_dynamic = s:mode.dynamic || s:gi_dynamic ? 1 : 0 + if both_dynamic + for char in s:valid_keys + sil!exe 'lnoremap ' . char . ' ' . + \ '=g:wubi()' . char . '=g:vimim()' + endfor + elseif s:mode.static + for char in s:valid_keys + sil!exe 'lnoremap ' . char . ' ' . char + endfor + else + let common_punctuations += split(". ,") + let common_labels += s:abcd[1:] + let pqwertyuio = s:vimim_cjk() ? s:qwer : [] + for _ in pqwertyuio + split("h j k l m n / ? s") + sil!exe 'lnoremap '._.' g:vimim_hjkl("'._.'")' + endfor + endif + if g:vimim_punctuation < 0 + elseif both_dynamic || s:mode.static + sil!call s:vimim_punctuation_maps() + endif + for _ in s:mode.windowless ? [] : common_punctuations + if _ !~ s:valid_keyboard + sil!exe 'lnoremap '._.' g:vimim_page("'._.'")' + endif + endfor + for _ in common_labels + sil!exe 'lnoremap '._.' g:vimim_label("'._.'")' + endfor +endfunction + +function! s:vimim_set_im_toggle_list() + let toggle_list = [] + if g:vimim_toggle < 0 + let toggle_list = [get(s:ui.frontends,0)] + elseif empty(g:vimim_toggle) + let toggle_list = s:ui.frontends + else + for toggle in split(g:vimim_toggle, ",") + for [root, im] in s:ui.frontends + if toggle == im + call add(toggle_list, [root, im]) + endif + endfor + endfor + endif + if s:backend[s:ui.root][s:ui.im].name =~ "bsddb" + let toggle_list = toggle_list[:2] " one bsddb two clouds + endif + let s:frontends = copy(toggle_list) + let s:ui.frontends = copy(toggle_list) + let s:ui.root = get(get(s:ui.frontends,0), 0) + let s:ui.im = get(get(s:ui.frontends,0), 1) +endfunction + +function! s:vimim_get_seamless(cursor_positions) + if empty(s:seamless_positions) + \|| s:seamless_positions[0] != a:cursor_positions[0] + \|| s:seamless_positions[1] != a:cursor_positions[1] + \|| s:seamless_positions[3] != a:cursor_positions[3] + return -1 + endif + let current_line = getline(a:cursor_positions[1]) + let seamless_column = s:seamless_positions[2]-1 + let len = a:cursor_positions[2]-1 - seamless_column + let snip = strpart(current_line, seamless_column, len) + if empty(len(snip)) + return -1 + endif + for char in split(snip, '\zs') + if char !~ s:valid_keyboard + return -1 + endif + endfor + return seamless_column +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: visual ==== {{{"] +" ================================================= + +function! g:vimim_visual() + let key = "" + let lines = split(getreg('"'), '\n') + let line = get(lines,0) + let space = "\=repeat(' '," .string(virtcol("'<'")-2). ")\" + if len(lines) == 1 && len(line) == s:multibyte + " highlight one chinese => get antonym or number loop + let results = s:vimim_imode_visual(line) + if !empty(results) + let key = "gvr" . get(results,0) . "ga" + endif + if s:vimim_cjk() + let line = match(s:cjk.lines, "^".line) + call s:vimim_set_title(s:space.get(s:cjk.lines,line)) + endif + elseif match(lines,'\d') > -1 && join(lines) !~ '[^0-9[:blank:].]' + call setpos(".", getpos("'>'")) " vertical digit block => + let sum = eval(join(lines,'+')) " count*average=summary + let ave = printf("%.2f", 1.0*sum/len(lines)) + let line = substitute(ave."=".string(sum), '[.]0\+', '', 'g') + let line = string(len(lines)) . '*' . line + let key = "o" . nr2char(4) . space . " " . line . nr2char(27) + else + sil!call s:vimim_start() + let visual = nr2char(30) . "\=g:vimim()\" + if len(lines) < 2 " highlight multiple cjk => show property + let s:seamless_positions = getpos("'<'") + let chinese = get(split(line,'\zs'),0) + let ddddd = char2nr(chinese) =~ '\d\d\d\d\d' ? "'''''" : line + let key = "gvc" . ddddd . visual + else " highlighted block => play block with hjkl + let key = "O^\" . space . "''''" . visual + endif + endif + return feedkeys(key,"n") +endfunction + +function! s:vimim_imode_visual(char_before) + let items = [] + let numbers = [] + let results = [] + if empty(s:loops) + for i in range(len(s:numbers)) + call add(items, split(s:numbers[i],'\zs')) + endfor + for j in range(len(get(items,0))) + let number = "" + for line in items + let number .= get(line,j) + endfor + call add(numbers, number) + endfor + for loop in numbers + split(s:antonym) + split("金石 真假 胜败") + let loops = split(loop, '\zs') + for i in range(len(loops)) + let j = i==len(loops)-1 ? 0 : i+1 + let s:loops[loops[i]] = loops[j] + endfor + endfor + endif + let char_before = a:char_before + if has_key(s:loops, char_before) + let start = char_before + let next = "" + while start != next + let next = s:loops[char_before] + call add(results, next) + let char_before = next + endwhile + endif + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: number ==== {{{"] +" ================================================= + +function! s:vimim_dictionary_numbers() + let s:loops = {} + let s:numbers = {} + let s:numbers.1 = "一壹⑴①甲" + let s:numbers.2 = "二贰⑵②乙" + let s:numbers.3 = "三叁⑶③丙" + let s:numbers.4 = "四肆⑷④丁" + let s:numbers.5 = "五伍⑸⑤戊" + let s:numbers.6 = "六陆⑹⑥己" + let s:numbers.7 = "七柒⑺⑦庚" + let s:numbers.8 = "八捌⑻⑧辛" + let s:numbers.9 = "九玖⑼⑨壬" + let s:numbers.0 = "〇零⑽⑩癸" + let s:quantifiers = copy(s:numbers) + let s:quantifiers.2 .= "两俩" + let s:quantifiers.b = "百佰步把包杯本笔部班" + let s:quantifiers.c = "次餐场串处床" + let s:quantifiers.d = "第度点袋道滴碟顶栋堆对朵堵顿" + let s:quantifiers.f = "分份发封付副幅峰方服" + let s:quantifiers.g = "个根股管" + let s:quantifiers.h = "行盒壶户回毫" + let s:quantifiers.j = "斤家具架间件节剂具捲卷茎记" + let s:quantifiers.k = "克口块棵颗捆孔" + let s:quantifiers.l = "里粒类辆列轮厘领缕" + let s:quantifiers.m = "米名枚面门秒" + let s:quantifiers.n = "年" + let s:quantifiers.p = "磅盆瓶排盘盆匹片篇撇喷" + let s:quantifiers.q = "千仟群" + let s:quantifiers.r = "日人" + let s:quantifiers.s = "十拾时升艘扇首双所束手" + let s:quantifiers.t = "天吨条头通堂趟台套桶筒贴" + let s:quantifiers.w = "万位味碗窝晚微" + let s:quantifiers.x = "席些项" + let s:quantifiers.y = "月元叶亿" + let s:quantifiers.z = "种只张株支总枝盏座阵桩尊则站幢宗兆" +endfunction + +let s:translators = {} +function! s:translators.translate(english) dict + let inputs = split(a:english) + return join(map(inputs,'get(self.dict,tolower(v:val),v:val)'), '') +endfunction + +function! s:vimim_imode_today_now(keyboard) + let one = " year sunday monday tuesday wednesday thursday" + let one .= " friday saturday month day hour minute second" + let two = join(split("年 日 一 二 三 四 五 六"), " 星期") + let two .= " 月 日 时 分 秒" + let chinese = copy(s:translators) + let chinese.dict = s:vimim_key_value_hash(one, two) + let time = '公元' + let time .= strftime("%Y") . ' year ' + let time .= strftime("%m") . ' month ' + let time .= strftime("%d") . ' day ' + if a:keyboard ==# 'itoday' + let time .= s:space .' '. strftime("%A") + elseif a:keyboard ==# 'inow' + let time .= strftime("%H") . ' hour ' + let time .= strftime("%M") . ' minute ' + let time .= strftime("%S") . ' second ' + endif + let filter = "substitute(" . 'v:val' . ",'^0','','')" + return chinese.translate(join(map(split(time), filter))) +endfunction + +function! s:vimim_imode_number(keyboard) + let keyboard = a:keyboard + let ii = keyboard[0:1] " sample: i88 ii88 isw8ql iisw8ql + let keyboard = ii==#'ii' ? keyboard[2:] : keyboard[1:] + let dddl = keyboard=~#'^\d*\l\{1}$' ? keyboard[:-2] : keyboard + let number = "" + let keyboards = split(dddl, '\ze') + for char in keyboards + if has_key(s:quantifiers, char) + let quantifier_list = split(s:quantifiers[char], '\zs') + let chinese = get(quantifier_list, 0) + if ii ==# 'ii' && char =~# '[0-9sbq]' + let chinese = get(quantifier_list, 1) + endif + let number .= chinese + endif + endfor + if empty(number) | return [] | endif + let results = [number] + let last_char = keyboard[-1:] + if !empty(last_char) && has_key(s:quantifiers, last_char) + let quantifier_list = split(s:quantifiers[last_char], '\zs') + if keyboard =~# '^[ds]\=\d*\l\{1}$' + if keyboard =~# '^[ds]' + let number = strpart(number,0,len(number)-s:multibyte) + endif + let results = map(copy(quantifier_list), 'number . v:val') + elseif keyboard =~# '^\d*$' && len(keyboards)<2 && ii != 'ii' + let results = quantifier_list + endif + endif + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: unicode ==== {{{"] +" ================================================= + +function! s:vimim_i18n(line) + let line = a:line + if s:localization == 1 + return iconv(line, "chinese", "utf-8") + elseif s:localization == 2 + return iconv(line, "utf-8", &enc) + endif + return line +endfunction + +function! s:vimim_unicode_list(ddddd) + let results = [] + for i in range(99) + call add(results, nr2char(a:ddddd+i)) + endfor + return results +endfunction + +function! s:vimim_get_unicode_ddddd(keyboard) + let ddddd = 0 + if a:keyboard =~# '^u\x\{4}$' " u9f9f => 40863 + let ddddd = str2nr(a:keyboard[1:],16) + elseif a:keyboard =~# '^\d\{5}$' " 39532 => 39532 + let ddddd = str2nr(a:keyboard, 10) + endif + let max = &encoding=="utf-8" ? 19968+20902 : 0xffff + if ddddd < 8080 || ddddd > max + let ddddd = 0 + endif + return ddddd +endfunction + +function! s:vimim_unicode_to_utf8(xxxx) + let utf8 = '' " u808f => 32911 => e8828f + let ddddd = str2nr(a:xxxx, 16) + if ddddd < 128 + let utf8 .= nr2char(ddddd) + elseif ddddd < 2048 + let utf8 .= nr2char(192+((ddddd-(ddddd%64))/64)) + let utf8 .= nr2char(128+(ddddd%64)) + else + let utf8 .= nr2char(224+((ddddd-(ddddd%4096))/4096)) + let utf8 .= nr2char(128+(((ddddd%4096)-(ddddd%64))/64)) + let utf8 .= nr2char(128+(ddddd%64)) + endif + return utf8 +endfunction + +function! s:vimim_url_xx_to_chinese(xx) + let output = a:xx " %E9%A6%AC => \xE9\xA6\xAC => 馬 u99AC + if s:http_exe =~ 'libvimim' + let output = libcall(s:http_exe, "do_unquote", output) + else + let pat = '%\(\x\x\)' + let sub = '\=eval(''"\x''.submatch(1).''"'')' + let output = substitute(output, pat, sub, 'g') + endif + return output +endfunction + +function! s:vimim_rot13(keyboard) + let a = "12345abcdefghijklmABCDEFGHIJKLM" + let z = "98760nopqrstuvwxyzNOPQRSTUVWXYZ" + return tr(a:keyboard, a.z, z.a) +endfunction + +function! s:vimim_left() + let key = 0 " validate the character on the left of the cursor + let one_byte_before = getline(".")[col(".")-2] + if one_byte_before =~ '\s' || empty(one_byte_before) + let key = "" + elseif one_byte_before =~# s:valid_keyboard + let key = 1 + endif + return key +endfunction + +function! s:vimim_key_value_hash(single, double) + let hash = {} + let singles = split(a:single) + let doubles = split(a:double) + for i in range(len(singles)) + let hash[get(singles,i)] = get(doubles,i) + endfor + return hash +endfunction + +function! s:chinese(...) + let chinese = "" + for english in a:000 + let cjk = english + if has_key(s:chinese_statusline, english) + let twins = split(s:chinese_statusline[english], ",") + let cjk = get(twins, 0) + if len(twins) > 1 && s:mandarin + let cjk = get(twins,1) + endif + endif + let chinese .= cjk + endfor + return chinese +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: cjk ==== {{{"] +" ================================================= + +function! s:vimim_cjk() + if empty(s:cjk.filename) + return 0 + elseif empty(s:cjk.lines) + let s:cjk.lines = s:vimim_readfile(s:cjk.filename) + if len(s:cjk.lines) != 20902 | return 0 | endif + endif + return 1 +endfunction + +function! s:vimim_cjk_in_4corner(chinese, info) + let digit_head = "" " gi ma 马  => 7712 <=> mali 7 4 + let digit_tail = "" " gi mali 马力 => 7 4002 <=> mali74 + let chinese = substitute(a:chinese,'[\x00-\xff]','','g') + for cjk in split(chinese, '\zs') + let line = match(s:cjk.lines, "^" . cjk) + if line > -1 + let values = split(get(s:cjk.lines, line)) + let digit_head .= get(values,1)[:0] + let digit_tail = get(values,1)[1:] + endif + endfor + let key = digit_head . digit_tail + let key = empty(a:info) && match(key, "^".s:hjkl) < 0 ? 0 : key + return key +endfunction + +function! s:vimim_cjk_property(chinese) + let ddddd = char2nr(a:chinese) + let xxxx = printf('u%04x', ddddd) + let unicode = ddddd . s:space . xxxx + if s:vimim_cjk() + let unicode = repeat(s:space,3) . xxxx . s:space . ddddd + let line = match(s:cjk.lines, "^" . a:chinese) + if line > -1 + let values = split(get(s:cjk.lines, line)) + let digit = get(values, 1) . s:space + let frequency = get(values, -1) !~ '\D' ? 1 : 0 + let pinyin = join(frequency ? values[2:-2] : values[2:]) + let unicode = digit . xxxx . s:space . pinyin + endif + endif + return unicode +endfunction + +function! s:vimim_cjk_match(key) + let key = a:key + if empty(key) || empty(s:vimim_cjk()) | return [] | endif + let grep = "" + let grep_frequency = '.*' . '\s\d\+$' + if key =~ '\d' + if key =~# '^\l\l\+[1-4]\>' && empty(len(s:hjkl)) + let grep = key . '[a-z ]' " cjk pinyin: huan2hai2 yi1 + else + let digit = "" + if key =~ '^\d\+' && key !~ '[^0-9]' + let digit = key " free style digit: 7 77 771 7712 + elseif key =~# '^\l\+\d\+' " free style: ma7 ma77 ma771 ma7712 + let digit = substitute(key,'\a','','g') + endif + if !empty(digit) + let space = '\d\{' . string(4-len(digit)) . '}' + let space = len(digit)==4 ? "" : space + let grep = '\s\+' . digit . space . '\s' + let alpha = substitute(key,'\d','','g') + if len(alpha) + let grep .= '\(\l\+\d\)\=' . alpha " le|yue: le4yue4 + elseif len(key) == 1 + let grep .= grep_frequency " grep l|y: happy music + endif + endif + endif + elseif s:ui.im != 'mycloud' + if len(key) == 1 " one cjk by frequency y72/yue72 l72/le72 + let grep = '[ 0-9]' . key . '\l*\d' . grep_frequency + let grep = key == 'u' ? ' u\( \|$\)' : grep " 214 unicode + elseif key =~# '^\l\+' " cjk list: /huan /hai /yet /huan2 /hai2 + let grep = '[ 0-9]' . key . '[0-9]' + endif + endif + let results = [] + if !empty(grep) + let line = match(s:cjk.lines, grep) + while line > -1 + let fields = split(get(s:cjk.lines, line)) + let frequency = get(fields,-1)=~'\l' ? 9999 : get(fields,-1) + call add(results, get(fields,0) . ' ' . frequency) + let line = match(s:cjk.lines, grep, line+1) + endwhile + endif + let results = sort(results, "s:vimim_sort_on_last") + let filter = "strpart(" . 'v:val' . ", 0, s:multibyte)" + return map(results, filter) +endfunction + +function! s:vimim_get_cjk_head(key) + let key = a:key + if empty(s:cjk.filename) || key =~ "'" | return "" | endif + if key =~# '^i' && empty (s:english.line) " iuuqwuqew => 77127132 + let key = s:vimim_qwertyuiop_1234567890(key[1:]) + endif + let head = "" + if s:touch_me_not || len(key) == 1 + let head = key + elseif key =~ '\d' + if key =~ '^\d' && key !~ '\D' + let head = len(key) > 4 ? s:vimim_get_head(key, 4) : key + let s:hjkl = empty(len(s:hjkl)) ? head : s:hjkl + elseif key =~# '^\l\+\d\+\>' " 7712 in 77124002 + let partition = match(key,'\d') " ma7 ma77 ma771 + let head = key[0 : partition-1] " mali in mali74 + let tail = key[partition :] " 74 in mali74 + if empty(s:vimim_get_pinyin(head)) && tail =~ '[1-4]' + return key " pinyin with tone: ma1/ma2/ma3/ma4 + endif + let s:hjkl = empty(len(s:hjkl)) ? tail : s:hjkl + elseif key =~# '^\l\+\d\+' " wo23 for input wo23you40 + let partition = match(key, '\(\l\+\d\+\)\@<=\D') + let head = s:vimim_get_head(key, partition) + endif + elseif empty(s:english.line) " muuqwxeyqpjeqqq => m7712x3610j3111 + if key =~# '^\l' && len(key)%5 < 1 " awwwr/a2224 arrow color + let dddd = s:vimim_qwertyuiop_1234567890(key[1:4]) + if !empty(dddd) + let key = key[0:0] . dddd . key[5:-1] + let head = s:vimim_get_head(key, 5) + endif + else + let head = key " get single character from cjk + endif + endif + return head +endfunction + +function! s:vimim_get_head(keyboard, partition) + if a:partition < 0 | return a:keyboard | endif + let head = a:keyboard[0 : a:partition-1] + if s:keyboard !~ '\S\s\S' + let s:keyboard = head + let tail = a:keyboard[a:partition : -1] + if !empty(tail) + let s:keyboard = head . " " . tail + endif + endif + return head +endfunction + +function! s:vimim_qwertyuiop_1234567890(keyboard) + if a:keyboard =~ '\d' | return "" | endif + let dddd = "" " output is 7712 for input uuqw + for char in split(a:keyboard, '\zs') + let digit = match(s:qwer, char) + if digit < 0 + return "" + else + let dddd .= digit + endif + endfor + return dddd +endfunction + +function! s:vimim_sort_on_last(line1, line2) + let line1 = get(split(a:line1),-1) + 1 + let line2 = get(split(a:line2),-1) + 1 + if line1 < line2 + return -1 + elseif line1 > line2 + return 1 + endif + return 0 +endfunction + +function! s:vimim_chinese_transfer() range abort + " the quick and dirty way to transfer between Chinese + if s:vimim_cjk() + exe a:firstline.",".a:lastline.'s/./\=s:vimim_1to1(submatch(0))' + endif +endfunction + +function! s:vimim_1to1(char) + if a:char =~ '[\x00-\xff]' | return a:char | endif + let grep = '^' . a:char + let line = match(s:cjk.lines, grep, 0) + if line < 0 | return a:char | endif + let values = split(get(s:cjk.lines, line)) + let traditional_chinese = get(split(get(values,0),'\zs'),1) + return empty(traditional_chinese) ? a:char : traditional_chinese +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: english ==== {{{"] +" ================================================= + +function! s:vimim_get_english(keyboard) + if empty(s:english.filename) + return "" " english: obama/now/version/ice/o2 + elseif empty(s:english.lines) + let s:english.lines = s:vimim_readfile(s:english.filename) + endif " [sql] select english from vimim.txt + let grep = '^' . a:keyboard . '\s\+' + let cursor = match(s:english.lines, grep) + let keyboards = s:vimim_get_pinyin(a:keyboard) + if cursor < 0 && len(a:keyboard) > 3 && len(keyboards) + let grep = '^' . get(split(a:keyboard,'\d'),0) " mxj7 => mxj + let cursor = match(s:english.lines, grep) + endif + let oneline = "" " [pinyin] cong => cong + if cursor > -1 " [english] congr => congratulation + let oneline = get(s:english.lines, cursor) + if a:keyboard != get(split(oneline),0) + let pairs = split(oneline) " haag haagendazs + let oneline = join(pairs[1:] + pairs[:0]) + let oneline = a:keyboard . " " . oneline + endif + endif + return oneline +endfunction + +function! s:vimim_filereadable(filename) + let datafile_1 = s:plugin . a:filename + let datafile_2 = s:plugon . a:filename + if filereadable(datafile_1) + return datafile_1 + elseif filereadable(datafile_2) + return datafile_2 + endif + return "" +endfunction + +function! s:vimim_readfile(datafile) + let lines = [] + if filereadable(a:datafile) + if s:localization + for line in readfile(a:datafile) + call add(lines, s:vimim_i18n(line)) + endfor + else + return readfile(a:datafile) + endif + endif + return lines +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: pinyin ==== {{{"] +" ================================================= + +function! s:vimim_get_all_valid_pinyin_list() +return split(" 'a 'ai 'an 'ang 'ao ba bai ban bang bao bei ben beng bi +\ bian biao bie bin bing bo bu ca cai can cang cao ce cen ceng cha chai +\ chan chang chao che chen cheng chi chong chou chu chua chuai chuan +\ chuang chui chun chuo ci cong cou cu cuan cui cun cuo da dai dan dang +\ dao de dei deng di dia dian diao die ding diu dong dou du duan dui dun +\ duo 'e 'ei 'en 'er fa fan fang fe fei fen feng fiao fo fou fu ga gai +\ gan gang gao ge gei gen geng gong gou gu gua guai guan guang gui gun +\ guo ha hai han hang hao he hei hen heng hong hou hu hua huai huan huang +\ hui hun huo 'i ji jia jian jiang jiao jie jin jing jiong jiu ju juan +\ jue jun ka kai kan kang kao ke ken keng kong kou ku kua kuai kuan kuang +\ kui kun kuo la lai lan lang lao le lei leng li lia lian liang liao lie +\ lin ling liu long lou lu luan lue lun luo lv ma mai man mang mao me mei +\ men meng mi mian miao mie min ming miu mo mou mu na nai nan nang nao ne +\ nei nen neng 'ng ni nian niang niao nie nin ning niu nong nou nu nuan +\ nue nuo nv 'o 'ou pa pai pan pang pao pei pen peng pi pian piao pie pin +\ ping po pou pu qi qia qian qiang qiao qie qin qing qiong qiu qu quan +\ que qun ran rang rao re ren reng ri rong rou ru ruan rui run ruo sa sai +\ san sang sao se sen seng sha shai shan shang shao she shei shen sheng +\ shi shou shu shua shuai shuan shuang shui shun shuo si song sou su suan +\ sui sun suo ta tai tan tang tao te teng ti tian tiao tie ting tong tou +\ tu tuan tui tun tuo 'u 'v wa wai wan wang wei wen weng wo wu xi xia +\ xian xiang xiao xie xin xing xiong xiu xu xuan xue xun ya yan yang yao +\ ye yi yin ying yo yong you yu yuan yue yun za zai zan zang zao ze zei +\ zen zeng zha zhai zhan zhang zhao zhe zhen zheng zhi zhong zhou zhu +\ zhua zhuai zhuan zhuang zhui zhun zhuo zi zong zou zu zuan zui zun zuo") +endfunction + +function! s:vimim_quanpin_transform(pinyin) + if empty(s:quanpin_table) + for key in s:vimim_get_all_valid_pinyin_list() + if key[0] == "'" + let s:quanpin_table[key[1:]] = key[1:] + else + let s:quanpin_table[key] = key + endif + endfor + for shengmu in s:shengmu_list + split("zh ch sh") + let s:quanpin_table[shengmu] = shengmu + endfor + endif + let item = a:pinyin + let index = 0 " follow ibus rule, plus special case for fan'guo + let pinyinstr = "" + while index < len(item) + if item[index] !~ "[a-z]" + let index += 1 + continue + endif + for i in range(6,1,-1) + let tmp = item[index : ] + if len(tmp) < i + continue + endif + let end = index+i + let matchstr = item[index : end-1] + if has_key(s:quanpin_table, matchstr) + let tempstr = item[end-1 : end] + let tempstr2 = item[end-2 : end+1] + let tempstr3 = item[end-1 : end+1] + let tempstr4 = item[end-1 : end+2] + if (tempstr == "ge" && tempstr3 != "ger") + \ || (tempstr == "ne" && tempstr3 != "ner") + \ || (tempstr4 == "gong" || tempstr3 == "gou") + \ || (tempstr4 == "nong" || tempstr3 == "nou") + \ || (tempstr == "ga" || tempstr == "na") + \ || tempstr2 == "ier" || tempstr == "ni" + \ || tempstr == "gu" || tempstr == "nu" + if has_key(s:quanpin_table, matchstr[:-2]) + let i -= 1 + let matchstr = matchstr[:-2] + endif + endif + let pinyinstr .= "'" . s:quanpin_table[matchstr] + let index += i + break + elseif i == 1 + let pinyinstr .= "'" . item[index] + let index += 1 + break + else + continue + endif + endfor + endwhile + return pinyinstr[0] == "'" ? pinyinstr[1:] : pinyinstr +endfunction + +function! s:vimim_more_pinyin_datafile(keyboard, sentence) + let results = [] + let backend = s:backend[s:ui.root][s:ui.im] + for candidate in s:vimim_more_pinyin_candidates(a:keyboard) + let pattern = '^' . candidate . '\>' + let cursor = match(backend.lines, pattern, 0) + if cursor < 0 + continue + elseif a:sentence + return [candidate] + endif + let oneline = get(backend.lines, cursor) + call extend(results, s:vimim_make_pairs(oneline)) + endfor + return results +endfunction + +function! s:vimim_get_pinyin(keyboard) + let keyboard = s:vimim_quanpin_transform(a:keyboard) + let results = split(keyboard, "'") + if len(results) > 1 + return results + endif + return [] +endfunction + +function! s:vimim_more_pinyin_candidates(keyboard) + " make standard menu layout: mamahuhu => mamahu, mama + if len(s:english.line) || s:ui.im !~ 'pinyin' + \|| !empty(g:vimim_shuangpin) || g:vimim_cloud =~ 'shuangpin' + return [] + endif + let candidates = [] + let keyboards = s:vimim_get_pinyin(a:keyboard) + if len(keyboards) + for i in reverse(range(len(keyboards)-1)) + let candidate = join(keyboards[0 : i], "") + if !empty(candidate) + call add(candidates, candidate) + endif + endfor + if len(candidates) > 2 + let candidates = candidates[0 : len(candidates)-2] + endif + endif + return candidates +endfunction + +function! s:vimim_cloud_pinyin(keyboard, match_list) + let match_list = [] + let keyboards = s:vimim_get_pinyin(a:keyboard) + for chinese in a:match_list + let len_chinese = len(split(chinese,'\zs')) + let english = join(keyboards[len_chinese :], "") + let pair = empty(english) ? chinese : chinese.english + call add(match_list, pair) + endfor + return match_list +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== input: shuangpin ==== {{{"] +" ================================================= + +function! s:vimim_shuangpin_generic() + let shengmu_list = {} " generate shuangpin table default value + for shengmu in s:shengmu_list + let shengmu_list[shengmu] = shengmu + endfor + let shengmu_list["'"] = "o" + let yunmu_list = {} + for yunmu in split("a o e i u v") + let yunmu_list[yunmu] = yunmu + endfor + return [shengmu_list, yunmu_list] +endfunction + +function! s:vimim_shuangpin_rules(shuangpin, rules) + let rules = a:rules + let key = ' ou ei ang en iong ua er ng ia ie ing un uo in ue ' + let key .= ' uan iu uai ong eng iang ui ai an ao iao ian uang ' + let v = '' " various value to almost the same key set + if a:shuangpin == 'ms' " test: viui => zhishi + let v = join(split('bzhfswrgwx;pontrqysgdvljkcmdy','\zs')) + call extend(rules[0], { "zh" : "v", "ch" : "i", "sh" : "u" }) + let key .= 'v' " microsoft shuangpin has one additional key + elseif a:shuangpin == 'abc' " test: vtpc => shuang pin + let v = 'b q h f s d r g d x y n o c m p r c s g t m l j k z w t' + call extend(rules[0], { "zh" : "a", "ch" : "e", "sh" : "v" }) + elseif a:shuangpin == 'nature' " test: woui => wo shi => i am + let v = 'b z h f s w r g w x y p o n t r q y s g d v l j k c m d' + call extend(rules[0], { "zh" : "v", "ch" : "i", "sh" : "u" }) + elseif a:shuangpin == 'plusplus' + let v = 'p w g r y b q t b m q z o l x c n x y t h v s f d k j h' + call extend(rules[0], { "zh" : "v", "ch" : "u", "sh" : "i" }) + elseif a:shuangpin == 'purple' + let v = 'z k s w h x j t x d ; m o y n l j y h t g n p r q b f g' + call extend(rules[0], { "zh" : "u", "ch" : "a", "sh" : "i" }) + elseif a:shuangpin == 'flypy' + let v = 'z w h f s x r g x p k y o b t r q k s g l v d j c n m l' + call extend(rules[0], { "zh" : "v", "ch" : "i", "sh" : "u" }) + endif + call extend(rules[1], s:vimim_key_value_hash(key, v)) + return rules +endfunction + +function! s:vimim_create_shuangpin_table(rules) + let pinyin_list = s:vimim_get_all_valid_pinyin_list() + let sptable = {} " generate table for shengmu-yunmu pairs match + for key in pinyin_list + if key !~ "['a-z]*" + continue + endif + let shengmu = key[0] + let yunmu = key[1:] + if key[1] == "h" + let shengmu = key[:1] + let yunmu = key[2:] + endif + if has_key(a:rules[0], shengmu) + let shuangpin_shengmu = a:rules[0][shengmu] + else + continue + endif + if has_key(a:rules[1], yunmu) + let shuangpin_yunmu = a:rules[1][yunmu] + else + continue + endif + let sp1 = shuangpin_shengmu.shuangpin_yunmu + if !has_key(sptable, sp1) + let sptable[sp1] = key[0] == "'" ? key[1:] : key + endif + endfor + if match(split("abc purple nature flypy"), g:vimim_shuangpin) > -1 + let jxqy = {"jv":"ju", "qv":"qu", "xv":"xu", "yv":"yu"} + call extend(sptable, jxqy) + elseif g:vimim_shuangpin == 'ms' " jxqy+v special case handling + let jxqy = {"jv":"jue", "qv":"que", "xv":"xue", "yv":"yue"} + call extend(sptable, jxqy) + endif + if g:vimim_shuangpin == 'flypy' " flypy special case handling + let key = 'ou eg er an ao ai aa en oo os ah ee ei' + let value = 'ou eng er an ao ai a en o ong ang e ei' + call extend(sptable, s:vimim_key_value_hash(key, value)) + endif + if g:vimim_shuangpin == 'nature' " nature special case handling + let nature = {"aa":"a", "oo":"o", "ee":"e" } + call extend(sptable, nature) + endif + for [key, value] in items(a:rules[0]) + let sptable[value] = key " table for shengmu-only match + if key[0] == "'" + let sptable[value] = "" + endif + endfor + return sptable +endfunction + +function! s:vimim_shuangpin_transform(keyboard) + let size = strlen(a:keyboard) + let ptr = 0 + let output = "" + let bchar = "" " workaround for sogou + while ptr < size + if a:keyboard[ptr] !~ "[a-z;]" " bypass all non-characters + let output .= a:keyboard[ptr] + let ptr += 1 + else + let sp1 = a:keyboard[ptr] + if a:keyboard[ptr+1] =~ "[a-z;]" + let sp1 .= a:keyboard[ptr+1] + endif + if has_key(s:shuangpin_table, sp1) + let output .= bchar . s:shuangpin_table[sp1] + else " the last odd shuangpin code as only shengmu + let output .= sp1 " invalid shuangpin code are preserved + endif + let ptr += strlen(sp1) + endif + endwhile + return output[0] == "'" ? output[1:] : output +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== python2 python3 ==== {{{"] +" ================================================= + +function! s:vimim_initialize_bsddb(datafile) +:sil!python << EOF +import vim +encoding = vim.eval("&encoding") +datafile = vim.eval('a:datafile') +try: + import bsddb3 as bsddb +except ImportError: + import bsddb as bsddb +edw = bsddb.btopen(datafile,'r') +def getstone(stone): + if stone not in edw: + while stone and stone not in edw: stone = stone[:-1] + return stone +def getgold(stone): + gold = stone + if stone and stone in edw: + gold = edw.get(stone) + if encoding == 'utf-8': + if datafile.find("gbk"): + gold = unicode(gold,'gb18030','ignore') + gold = gold.encode(encoding,'ignore') + gold = stone + ' ' + gold + return gold +EOF +endfunction + +function! s:vimim_get_stone_from_bsddb(stone) +:sil!python << EOF +try: + stone = vim.eval('a:stone') + marble = getstone(stone) + vim.command("return '%s'" % marble) +except vim.error: + print("vim error: %s" % vim.error) +EOF +return "" +endfunction + +function! s:vimim_get_gold_from_bsddb(stone) +:sil!python << EOF +try: + gold = getgold(vim.eval('a:stone')) + vim.command("return '%s'" % gold) +except vim.error: + print("vim error: %s" % vim.error) +EOF +return "" +endfunction + +function! s:vimim_get_from_python2(input, cloud) +:sil!python << EOF +import vim, urllib2, socket +cloud = vim.eval('a:cloud') +input = vim.eval('a:input') +encoding = vim.eval("&encoding") +try: + socket.setdefaulttimeout(20) + urlopen = urllib2.urlopen(input, None) + response = urlopen.read() + res = "'" + str(response) + "'" + if cloud == 'qq': + if encoding != 'utf-8': + res = unicode(res, 'utf-8').encode('utf-8') + elif cloud == 'google': + if encoding != 'utf-8': + res = unicode(res, 'unicode_escape').encode("utf8") + elif cloud == 'baidu': + if encoding != 'utf-8': + res = str(response) + else: + res = unicode(response, 'gbk').encode(encoding) + vim.command("let g:baidu = %s" % res) + vim.command("return %s" % res) + urlopen.close() +except vim.error: + print("vim error: %s" % vim.error) +EOF +return "" +endfunction + +function! s:vimim_get_from_python3(input, cloud) +:sil!python3 << EOF +import vim, urllib.request +try: + cloud = vim.eval('a:cloud') + input = vim.eval('a:input') + urlopen = urllib.request.urlopen(input) + response = urlopen.read() + if cloud != 'baidu': + res = "'" + str(response.decode('utf-8')) + "'" + else: + if vim.eval("&encoding") != 'utf-8': + res = str(response)[2:-1] + else: + res = response.decode('gbk') + vim.command("let g:baidu = %s" % res) + vim.command("return %s" % res) + urlopen.close() +except vim.error: + print("vim error: %s" % vim.error) +EOF +return "" +endfunction + +function! s:vimim_mycloud_python_init() +:sil!python << EOF +import vim, sys, socket +BUFSIZE = 1024 +def tcpslice(sendfunc, data): + senddata = data + while len(senddata) >= BUFSIZE: + sendfunc(senddata[0:BUFSIZE]) + senddata = senddata[BUFSIZE:] + if senddata[-1:] == "\n": + sendfunc(senddata) + else: + sendfunc(senddata+"\n") +def tcpsend(data, host, port): + addr = host, port + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect(addr) + except Exception, inst: + s.close() + return None + ret = "" + for item in data.split("\n"): + if item == "": + continue + tcpslice(s.send, item) + cachedata = "" + while cachedata[-1:] != "\n": + data = s.recv(BUFSIZE) + cachedata += data + if cachedata == "server closed\n": + break + ret += cachedata + s.close() + return ret +def parsefunc(keyb, host="localhost", port=10007): + src = keyb.encode("base64") + ret = tcpsend(src, host, port) + if type(ret).__name__ == "str": + try: + return ret.decode("base64") + except Exception: + return "" + else: + return "" +EOF +endfunction + +function! s:vimim_mycloud_python_client(cmd) +:sil!python << EOF +try: + cmd = vim.eval("a:cmd") + HOST = vim.eval("s:mycloud_host") + PORT = int(vim.eval("s:mycloud_port")) + ret = parsefunc(cmd, HOST, PORT) + vim.command('return "%s"' % ret) +except vim.error: + print("vim error: %s" % vim.error) +EOF +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== backend: file ==== {{{"] +" ================================================= + +function! s:vimim_set_datafile(im, datafile) + let im = a:im + if isdirectory(a:datafile) | return + elseif im =~ '^wubi' | let im = 'wubi' + elseif im =~ '^pinyin' | let im = 'pinyin' | endif + let s:ui.root = 'datafile' + let s:ui.im = im + call insert(s:ui.frontends, [s:ui.root, s:ui.im]) + let s:backend.datafile[im] = {} + let s:backend.datafile[im].root = s:ui.root + let s:backend.datafile[im].im = s:ui.im + let s:backend.datafile[im].name = a:datafile + let s:backend.datafile[im].keycode = s:keycodes[im] + let s:backend.datafile[im].chinese = s:chinese(im) + let s:backend.datafile[im].lines = [] +endfunction + +function! s:vimim_sentence_datafile(keyboard) + let backend = s:backend[s:ui.root][s:ui.im] + let fuzzy = s:ui.im =~ 'pinyin' ? ' ' : "" + let pattern = '^\V' . a:keyboard . fuzzy + let cursor = match(backend.lines, pattern) + if cursor > -1 | return a:keyboard | endif + let candidates = s:vimim_more_pinyin_datafile(a:keyboard,1) + if !empty(candidates) | return get(candidates,0) | endif + let max = len(a:keyboard) + while max > 1 + let max -= 1 + let pattern = '^\V' . strpart(a:keyboard,0,max) . ' ' + let cursor = match(backend.lines, pattern) + if cursor > -1 | break | endif + endwhile + return cursor < 0 ? "" : a:keyboard[: max-1] +endfunction + +function! s:vimim_get_from_datafile(keyboard) + let fuzzy = s:ui.im =~ 'pinyin' ? ' ' : "" + let pattern = '^\V' . a:keyboard . fuzzy + let backend = s:backend[s:ui.root][s:ui.im] + let cursor = match(backend.lines, pattern) + if cursor < 0 | return [] | endif + let oneline = get(backend.lines, cursor) + let results = split(oneline)[1:] + if len(s:english.line) || len(results) > 10 + return results + endif + if s:ui.im =~ 'pinyin' + let extras = s:vimim_more_pinyin_datafile(a:keyboard,0) + let results = s:vimim_make_pairs(oneline) + extras + else " http://code.google.com/p/vimim/issues/detail?id=121 + let results = [] + let s:show_extra_menu = 1 + for i in range(10) + let cursor += i " get more if less + let oneline = get(backend.lines, cursor) + let results += s:vimim_make_pairs(oneline) + endfor + endif + return results +endfunction + +function! s:vimim_get_from_database(keyboard) + let oneline = s:vimim_get_gold_from_bsddb(a:keyboard) + if empty(oneline) | return [] | endif + let results = s:vimim_make_pairs(oneline) + if empty(s:english.line) && len(results) && len(results) < 20 + for candidate in s:vimim_more_pinyin_candidates(a:keyboard) + let oneline = s:vimim_get_gold_from_bsddb(candidate) + if empty(oneline) || match(oneline,' ')<0 | continue | endif + let results += s:vimim_make_pairs(oneline) + if len(results) > 20*2 | break | endif + endfor + endif + return results +endfunction + +function! s:vimim_make_pairs(oneline) + if empty(a:oneline) || match(a:oneline,' ') < 0 + return [] + endif + let oneline_list = split(a:oneline) + let menu = remove(oneline_list, 0) + let results = [] + for chinese in oneline_list + call add(results, menu .' '. chinese) + endfor + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== backend: dir ==== {{{"] +" ================================================= + +function! s:vimim_set_directory(dir) + let im = "pinyin" + let s:ui.root = 'directory' + let s:ui.im = im + call insert(s:ui.frontends, [s:ui.root, s:ui.im]) + let s:backend.directory[im] = {} + let s:backend.directory[im].root = s:ui.root + let s:backend.directory[im].im = im + let s:backend.directory[im].name = a:dir + let s:backend.directory[im].keycode = s:keycodes[im] + let s:backend.directory[im].chinese = s:chinese(im) +endfunction + +function! s:vimim_sentence_directory(keyboard, directory) + let filename = a:directory . a:keyboard + if filereadable(filename) | return a:keyboard | endif + let max = len(a:keyboard) + while max > 1 + let max -= 1 " workaround: filereadable("/filename.") return true + let head = strpart(a:keyboard, 0, max) + let filename = a:directory . head + if filereadable(filename) && head[-1:-1] != "." | break | endif + endwhile + return filereadable(filename) ? a:keyboard[: max-1] : "" +endfunction + +function! s:vimim_set_backend_embedded() + " (1/3) scan pinyin directory database + let dir = s:plugin . "pinyin" " always test ../plugin/pinyin/pinyin + if isdirectory(dir) + if filereadable(dir . "/pinyin") + return s:vimim_set_directory(dir . "/") + endif + endif + " (2/3) scan bsddb database as edw: enterprise data warehouse + if has("python") " bsddb is from Python 2 only with 46,694,400 Bytes + let datafile = s:vimim_filereadable("vimim.gbk.bsddb") + if !empty(datafile) + return s:vimim_set_datafile("pinyin", datafile) + endif + endif + " (3/3) scan all supported data files, in order + for im in s:all_vimim_input_methods + let datafile = s:vimim_filereadable("vimim." . im . ".txt") + if empty(datafile) + let filename = "vimim." . im . "." . &encoding . ".txt" + let datafile = s:vimim_filereadable(filename) + endif + if !empty(datafile) + call s:vimim_set_datafile(im, datafile) + endif + endfor +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== backend: clouds ==== {{{"] +" ================================================= + +function! s:vimim_set_backend_clouds() + let cloud_defaults = split(s:rc["g:vimim_cloud"],',') + let s:cloud = get(cloud_defaults,0) + if g:vimim_cloud < 0 | return | endif + let clouds = split(g:vimim_cloud,',') + for cloud in clouds + let cloud = get(split(cloud,'[.]'),0) + call remove(cloud_defaults, match(cloud_defaults,cloud)) + endfor + let clouds += cloud_defaults + let g:vimim_cloud = join(clouds,',') + let default = get(split(get(clouds,0),'[.]'),0) + if match(s:rc["g:vimim_cloud"], default) > -1 + let s:cloud = default + endif + if !empty(s:vimim_check_http_executable()) + let s:ui.root = 'cloud' + for cloud in reverse(split(g:vimim_cloud,',')) + let im = get(split(cloud,'[.]'),0) + let s:ui.im = im + call insert(s:ui.frontends, [s:ui.root, s:ui.im]) + let s:backend.cloud[im] = {} + let s:backend.cloud[im].root = s:ui.root + let s:backend.cloud[im].im = 0 " used for cloud key + let s:backend.cloud[im].keycode = s:keycodes[im] + let s:backend.cloud[im].name = s:chinese(im) + let s:backend.cloud[im].chinese = s:chinese(im) + endfor + endif +endfunction + +function! s:vimim_check_http_executable() + if g:vimim_cloud < 0 && len(g:vimim_mycloud) < 3 + return 0 + elseif len(s:http_exe) > 3 + return s:http_exe + endif + " step 1 of 4: try to find libvimim for mycloud + let lib = has("win32") || has("win32unix") ? "dll" : "so" + let libvimim = s:plugin . "libvimim." . lib + if filereadable(libvimim) + let libvimim = has("win32") ? libvimim[:-5] : libvimim + if libcall(libvimim, "do_geturl", "__isvalid") ==# "True" + let s:http_exe = libvimim + endif + endif + " step 2 of 4: try to use dynamic python: + if empty(s:http_exe) + if has('python') + let s:http_exe = 'Python2 Interface to Vim' " +python/dyn + elseif has('python3') && &relativenumber + let s:http_exe = 'Python3 Interface to Vim' " +python3/dyn + endif + endif + " step 3 of 4: try to find wget + if empty(s:http_exe) || has("macunix") + let wget_exe = s:plugin . 'wget.exe' + let wget = filereadable(wget_exe) ? wget_exe : 'wget' + if executable(wget) + let wget_option = " -qO - --timeout 20 -t 10 " + let s:http_exe = wget . wget_option + endif + endif + " step 4 of 4: try to find curl if wget not available + if empty(s:http_exe) && executable('curl') + let s:http_exe = "curl -s " + endif + return s:http_exe +endfunction + +function! s:vimim_get_cloud(keyboard, cloud) + let keyboard = a:keyboard " remove evil leading/trailing quote + let keyboard = keyboard[:0] == "'" ? keyboard[1:] : keyboard + let keyboard = keyboard[-1:] == "'" ? keyboard[:-2] : keyboard + if keyboard !~ s:valid_keyboard || empty(a:cloud) + return [] + endif + let cloud = "s:vimim_get_cloud_" . a:cloud . "(keyboard)" + let results = [] + try + let results = eval(cloud) + catch + sil!call s:vimim_debug(a:cloud, v:exception) + endtry + if !empty(results) && s:keyboard !~ '\S\s\S' + let s:keyboard = keyboard + endif + return results +endfunction + +function! s:vimim_get_from_http(input, cloud) + if empty(a:input) || empty(s:vimim_check_http_executable()) + return "" + endif + try + if s:http_exe =~ 'Python3' + return s:vimim_get_from_python3(a:input, a:cloud) + elseif s:http_exe =~ 'Python2' + return s:vimim_get_from_python2(a:input, a:cloud) + elseif s:http_exe =~ 'libvimim' + return libcall(s:http_exe, "do_geturl", a:input) + elseif len(s:http_exe) + return system(s:http_exe . shellescape(a:input)) + endif + catch + sil!call s:vimim_debug("s:http_exe exception", v:exception) + endtry + return "" +endfunction + +function! s:vimim_get_cloud_sogou(keyboard) + " http://web.pinyin.sogou.com/api/py?key=32&query=xj + let results = [] + if empty(s:backend.cloud.sogou.im) " as cloud key + let key_sogou = "http://web.pinyin.sogou.com/web_ime/patch.php" + let output = s:vimim_get_from_http(key_sogou, 'sogou') + let s:backend.cloud.sogou.im = get(split(output, '"'), 1) + endif + let input = 'http://web.pinyin.sogou.com/api/py' + let input .= '?key=' . s:backend.cloud.sogou.im + let input .= '&query=' . a:keyboard + let output = s:vimim_get_from_http(input, 'sogou') + if empty(output) || output =~ '502 bad gateway' + return [] + endif + let first = match(output, '"', 0) + let second = match(output, '"', 0, 2) + if first && second + let output = strpart(output, first+1, second-first-1) + let output = s:vimim_url_xx_to_chinese(output) + endif + let output = s:localization ? s:vimim_i18n(output) : output + for item in split(output, '\t+') + let item_list = split(item, s:colon) + if len(item_list) > 1 + let english = strpart(a:keyboard, 0, get(item_list,1)) + let english_chinese = english . " " . get(item_list,0) + call add(results, english_chinese) + endif + endfor + return results +endfunction + +function! s:vimim_get_cloud_qq(keyboard) + " http://ime.qq.com/fcgi-bin/getword?key=32&q=mxj + let results = [] + let input = 'http://ime.qq.com/fcgi-bin/' + if empty(s:backend.cloud.qq.im) " as cloud key + let output = s:vimim_get_from_http(input . 'getkey', 'qq') + let s:backend.cloud.qq.im = get(split(output, '"'), 3) + endif + let clouds = split(g:vimim_cloud,',') " qq.shuangpin.abc,google + let vimim_cloud = get(clouds, match(clouds,'qq')) " qq.shuangpin.abc + if vimim_cloud =~ 'wubi' + let input .= 'gwb' + else + let input .= 'getword' + endif + let input .= '?key=' . s:backend.cloud.qq.im + if vimim_cloud =~ 'fanti' + let input .= '&jf=1' + endif + let md = vimim_cloud =~ 'mixture' ? 3 : 0 + if vimim_cloud =~ 'shuangpin' + let md = 2 " qq.shuangpin.ms => ms + let shuangpin = get(split(vimim_cloud,"[.]"), -1) + let st = match(split(s:shuangpin),shuangpin) + 1 + if st + let input .= '&st=' . st + endif + endif + if md + let input .= '&md=' . md + endif + if vimim_cloud =~ 'fuzzy' + let input .= '&mh=1' + endif + let input .= '&q=' . a:keyboard + let output = s:vimim_get_from_http(input, 'qq') + if empty(output) || output =~ '502 bad gateway' + return [] + endif " qq => {'q':'fuck','rs':['\xe5\xa6\x87'] + let output = s:localization ? s:vimim_i18n(output) : output + let output_hash = eval(output) + if type(output_hash) == type({}) && has_key(output_hash, 'rs') + let results = output_hash['rs'] " as key + endif + if vimim_cloud !~ 'wubi' && vimim_cloud !~ 'shuangpin' + let results = s:vimim_cloud_pinyin(a:keyboard, results) + endif + return results +endfunction + +function! s:vimim_get_cloud_google(keyboard) + " http://google.com/transliterate?tl_app=3&tlqt=1&num=20&text=mxj + let input = 'http://www.google.com/transliterate/chinese' + let input .= '?langpair=en|zh' . '&num=20' . '&tl_app=3' + let input .= '&tlqt=1' . '&text=' . a:keyboard + let output = join(split(s:vimim_get_from_http(input,'google'))) + let results = [] " [{'ew':'fuck','hws':['\u5987\u4EA7\u79D1',]},] + if s:localization + if s:http_exe =~ 'Python2' + let output = s:vimim_i18n(output) + else + for item in split(get(split(output),8),",") + let utf8 = "" " play with unicode + for xxxx in split(item, "\u") + let utf8 .= s:vimim_unicode_to_utf8(xxxx) + endfor + let output = s:vimim_i18n(utf8) + call add(results, output) + endfor + return results + endif + endif + let output_hash = get(eval(output),0) + if type(output_hash) == type({}) && has_key(output_hash, 'hws') + let results = output_hash['hws'] " as key + endif + let results = s:vimim_cloud_pinyin(a:keyboard, results) + return results +endfunction + +function! s:vimim_get_cloud_baidu(keyboard) + " http://olime.baidu.com/py?rn=0&pn=20&py=mxj + let results = [] + let url = 'http://olime.baidu.com/py' + let input = '?rn=0' . '&pn=20' . '&py=' . a:keyboard + let output = s:vimim_get_from_http(url . input, 'baidu') + let output_list = [] " ['[[['\xc3\xb0\xcf\xd5',3] + if exists("g:baidu") && type(g:baidu) == type([]) + let output_list = get(g:baidu,0) + endif + if empty(output_list) + if empty(output) || output =~ '502 bad gateway' + return [] + elseif empty(s:localization) + let output = iconv(output, "gbk", "utf-8") + endif + let output_list = get(eval(output),0) + endif + for item_list in output_list + let keyboard = substitute(a:keyboard,'\W','','g') + let english = strpart(keyboard, get(item_list,1)) + call add(results, get(item_list,0) . english) + endfor + return results +endfunction + +function! s:vimim_get_all_clouds(key) + let results = [] + for cloud in split(s:rc["g:vimim_cloud"], ',') + let start = reltime() + let title = s:chinese(s:space, cloud, 'cloud', s:space) + let outputs = s:vimim_get_cloud(a:key, cloud) + let outputs = &number ? outputs : outputs[0:9] + let filter = "substitute(" . 'v:val' . ",'[a-z ]','','g')" + call add(results, a:key . title . reltimestr(reltime(start))) + call add(results, join(map(outputs,filter))) + call add(results, s:space) + endfor + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== backend: mycloud ==== {{{"] +" ================================================= + +function! s:vimim_set_backend_mycloud() + let s:mycloud_arg = "" + let s:mycloud_mode = "libcall" + let s:mycloud_func = "do_getlocal" + let s:mycloud_host = "localhost" + let s:mycloud_port = 10007 + let s:mycloud_initialization = 0 + if !empty(g:vimim_mycloud) && g:vimim_mycloud != -1 + let s:ui.root = 'cloud' + let s:ui.im = 'mycloud' + call insert(s:ui.frontends, [s:ui.root, s:ui.im]) + let s:backend.cloud.mycloud = {} + let s:backend.cloud.mycloud.root = s:ui.root + let s:backend.cloud.mycloud.name = s:chinese(s:ui.im) + let s:backend.cloud.mycloud.chinese = s:chinese(s:ui.im) + let s:backend.cloud.mycloud.keycode = s:valid_keyboard + let s:backend.cloud.mycloud.directory = s:ui.im + let s:backend.cloud.mycloud.im = s:ui.im + endif +endfunction + +function! s:vimim_get_mycloud(keyboard) + if s:mycloud_initialization < 0 + return [] + elseif s:mycloud_initialization < 1 + let s:mycloud_initialization = 1 + let mycloud = s:vimim_mycloud_set_and_play() + if empty(mycloud) + let s:mycloud_initialization = -1 " fail to start mycloud + return [] + endif " mycloud late binding: get/set real data from server + let s:backend.cloud.mycloud.im = mycloud + let ret = s:vimim_mycloud(mycloud, "__getkeychars") + let s:backend.cloud.mycloud.keycode = split(ret,"\t")[0] + let ret = s:vimim_mycloud(mycloud, "__getname") + let s:backend.cloud.mycloud.directory = split(ret,"\t")[0] + call s:vimim_set_frontend() + endif + let results = [] + let output = s:vimim_mycloud(s:backend.cloud.mycloud.im, a:keyboard) + for item in split(output, '\n') + let item_list = split(item, '\t') + let chinese = get(item_list,0) + let chinese = s:localization ? s:vimim_i18n(chinese) : chinese + if empty(chinese) || get(item_list,1,-1) < 0 + continue + endif + let extra_text = get(item_list,2) + let english = a:keyboard[get(item_list,1):] + call add(results, extra_text . " " . chinese . english) + endfor + return results +endfunction + +function! s:vimim_mycloud_set_and_play() + let part = split(g:vimim_mycloud, ':') + if len(part) <= 1 + sil!call s:vimim_debug('alert', "mycloud_url_too_short") + elseif part[0] ==# 'py' && has("python") + " :let g:vimim_mycloud = "py:127.0.0.1" + if len(part) > 2 + let s:mycloud_host = part[1] + let s:mycloud_port = part[2] + elseif len(part) > 1 + let s:mycloud_host = part[1] + endif + try + call s:vimim_mycloud_python_init() + let s:mycloud_mode = "python" + if s:vimim_mycloud_isvalid(part[1]) + return "python" + endif + catch + sil!call s:vimim_debug('python_mycloud=', v:exception) + endtry + elseif part[0] ==# 'app' && !has("gui_win32") + " :let g:vimim_mycloud = "app:python d:/mycloud/mycloud.py" + let cloud = part[1] + if len(part) == 3 + let part1 = part[1][0] == '/' ? part[1][1:] : part[1] + let cloud = part1 . ':' . part[2] + endif + if executable(split(cloud)[0]) + let s:mycloud_mode = "system" + if s:vimim_mycloud_isvalid(cloud) + return cloud + endif + endif + elseif part[0] ==# "dll" + " :let g:vimim_mycloud = "dll:/data/libvimim.so:192.168.0.1" + let base = len(part[1]) == 1 ? 1 : 0 + if len(part) >= base+4 + let s:mycloud_func = part[base+3] + endif + let s:mycloud_arg = len(part) >= base+3 ? part[base+2] : "" + let libvimim = base == 1 ? part[1] . ':' . part[2] : part[1] + if filereadable(libvimim) + let s:mycloud_mode = "libcall" + let libvimim = has("win32") ? libvimim[:-5] : libvimim + if s:vimim_mycloud_isvalid(libvimim) + return libvimim + endif + endif + elseif part[0] ==# "http" || part[0] ==# "https" + " :let g:vimim_mycloud = "http://pim-cloud.appspot.com/qp/" + if !empty(s:vimim_check_http_executable()) + let s:mycloud_mode = "www" + if s:vimim_mycloud_isvalid(g:vimim_mycloud) + return g:vimim_mycloud + endif + endif + else + sil!call s:vimim_debug('alert', "invalid_mycloud_url") + endif + return 0 +endfunction + +function! s:vimim_mycloud(cloud, cmd) + let ret = "" + if s:mycloud_mode == "libcall" + let arg = empty(s:mycloud_arg) ? '' : s:mycloud_arg . " " + let ret = libcall(a:cloud, s:mycloud_func, arg . a:cmd) + elseif s:mycloud_mode == "python" + let ret = s:vimim_mycloud_python_client(a:cmd) + elseif s:mycloud_mode == "system" + let ret = system(a:cloud . " " . shellescape(a:cmd)) + elseif s:mycloud_mode == "www" + let input = a:cloud . s:vimim_rot13(a:cmd) + if s:http_exe =~ 'libvimim' + let ret = libcall(s:http_exe, "do_geturl", input) + elseif len(s:http_exe) + let ret = system(s:http_exe . shellescape(input)) + endif + if len(ret) + let output = s:vimim_rot13(ret) + let ret = s:vimim_url_xx_to_chinese(output) + endif + endif + return ret +endfunction + +function! s:vimim_mycloud_isvalid(cloud) + let ret = s:vimim_mycloud(a:cloud, "__isvalid") + if split(ret, "\t")[0] == "True" + return 1 + endif + return 0 +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== /search ==== {{{"] +" ================================================= + +function! g:vimim_search() + let results = [] + let english = @/ + if len(english) > 1 && len(english) < 20 && english !~ "[^0-9a-z']" + \&& v:errmsg =~# english && v:errmsg =~# '^E486: ' + try + let results = s:vimim_search_chinese_by_english(english) + catch + sil!call s:vimim_debug('slash search /', v:exception) + endtry + endif + if !empty(results) + let results = split(substitute(join(results),'\w','','g')) + call sort(results, "s:vimim_sort_on_length") + let slash = join(results[0:9], '\|') + let @/ = empty(search(slash,'nw')) ? english : slash + endif + echon "/" . english + let v:errmsg = "" +endfunction + +function! s:vimim_sort_on_length(i1, i2) + return len(a:i2) - len(a:i1) +endfunc + +function! s:vimim_search_chinese_by_english(key) + let key = tolower(a:key) + let results = [] + " 1/3 first try search from mycloud or cloud if available + if s:ui.im == 'mycloud' + let results = s:vimim_get_mycloud(key) + elseif s:ui.root == 'cloud' || key[-1:] == "'" + let results = s:vimim_get_cloud(key, s:cloud) + endif + if len(results) | return results | endif + " 2/3 search unicode or cjk /search unicode /u808f + let ddddd = s:vimim_get_unicode_ddddd(key) + if !empty(ddddd) + let results = [nr2char(ddddd)] + elseif s:vimim_cjk() + while len(key) > 1 + let head = s:vimim_get_cjk_head(key) + if empty(head) " /muuqwxeyqpjeqqq + break " /m7712x3610j3111 + else " /ma77xia36ji31 + let matches = s:vimim_cjk_match(head) + if len(matches) + let chinese = join(matches[:9], '') + call add(results, "[" . chinese . "]") + endif + let key = strpart(key, len(head)) + endif + endwhile + let results = len(results) > 1 ? [join(results,'')] : results + endif + if len(results) | return results | endif + " 3/3 search datafile and english: /ma and /horse + let key = tolower(a:key) + let results = split(s:vimim_get_english(key)) + if empty(results) + let results = s:vimim_embedded_backend_engine(key) + endif + return results +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== core workflow ==== {{{"] +" ================================================= + +function! s:vimim_start() + sil!call s:vimim_save_vimrc() + sil!call s:vimim_set_vimrc() + sil!call s:vimim_set_frontend() + sil!call s:vimim_set_keyboard_maps() + lnoremap g:vimim_backspace() + lnoremap g:vimim_esc() + lnoremap g:vimim_one_key_correction() + lnoremap g:vimim_cycle_vimim() + if s:ui.im =~ 'array' + lnoremap g:vimim_space() + lnoremap g:vimim_pagedown() + else + lnoremap g:vimim_enter() + lnoremap g:vimim_space() + endif + let key = '' + if empty(s:ctrl6) + let s:ctrl6 = 32911 + let key = nr2char(30) + endif + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_stop() + if has("gui_running") + lmapclear + endif + let key = nr2char(30) " i_CTRL-^ + let s:ui.frontends = copy(s:frontends) + sil!call s:vimim_restore_vimrc() + sil!call s:vimim_super_reset() + sil!exe 'sil!return "' . key . '"' +endfunction + +function! s:vimim_save_vimrc() + let s:cpo = &cpo + let s:omnifunc = &omnifunc + let s:complete = &complete + let s:completeopt = &completeopt + let s:statusline = &statusline + let s:lazyredraw = &lazyredraw +endfunction + +function! s:vimim_set_vimrc() + set title noshowmatch shellslash + set completeopt=menuone + set complete=. + set nolazyredraw + set omnifunc=VimIM +endfunction + +function! s:vimim_restore_vimrc() + let &cpo = s:cpo + let &omnifunc = s:omnifunc + let &complete = s:complete + let &completeopt = s:completeopt + let &statusline = s:statusline + let &lazyredraw = s:lazyredraw + let &titlestring = s:titlestring + let &pumheight = s:pumheights.saved +endfunction + +function! s:vimim_super_reset() + sil!call s:vimim_reset_before_anything() + sil!call s:vimim_reset_before_omni() + sil!call s:vimim_reset_after_insert() +endfunction + +function! s:vimim_reset_before_anything() + let s:has_shuangpin_transform = 0 " todo + let s:mode = s:onekey + let s:keyboard = "" + let s:omni = 0 + let s:ctrl6 = 0 + let s:switch = 0 + let s:toggle_im = 0 + let s:smart_enter = 0 + let s:gi_dynamic_on = 0 + let s:toggle_punctuation = 1 + let s:popup_list = [] +endfunction + +function! s:vimim_reset_before_omni() + let s:english.line = "" + let s:touch_me_not = 0 + let s:show_extra_menu = 0 + let s:cursor_at_windowless = 0 +endfunction + +function! s:vimim_reset_after_insert() + let s:match_list = [] + let s:pageup_pagedown = 0 + let s:pattern_not_found = 0 + let s:hjkl = "" " reset for nothing + let s:hjkl__ = 0 " toggle simplified/traditional + let s:hjkl_h = 0 " toggle cjk property + let s:hjkl_l = 0 " toggle label length + let s:hjkl_m = 0 " toggle cjjp/c'j'j'p +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== core engine ==== {{{"] +" ================================================= + +function! VimIM(start, keyboard) +let valid_keyboard = s:wubi ? s:valid_wubi_keyboard : s:valid_keyboard +if a:start + let cursor_positions = getpos(".") + let start_row = cursor_positions[1] + let start_column = cursor_positions[2]-1 + let current_line = getline(start_row) + let before = current_line[start_column-1] + let seamless_column = s:vimim_get_seamless(cursor_positions) + if seamless_column < 0 + let s:seamless_positions = [] + let last_seen_bslash_column = copy(start_column) + let last_seen_nonsense_column = copy(start_column) + let all_digit = 1 + while start_column + if before =~# valid_keyboard + let start_column -= 1 + if before !~# "[0-9']" || s:ui.im =~ 'phonetic' + let last_seen_nonsense_column = start_column + let all_digit = all_digit ? 0 : all_digit + endif + elseif before == '\' " do nothing if leading bslash found + let s:pattern_not_found = 1 + return last_seen_bslash_column + else + break + endif + let before = current_line[start_column-1] + endwhile + if all_digit < 1 && current_line[start_column] =~ '\d' + let start_column = last_seen_nonsense_column + endif + else + let start_column = seamless_column + endif + let len = cursor_positions[2]-1 - start_column + let keyboard = strpart(current_line, start_column, len) + if s:keyboard !~ '\S\s\S' + let s:keyboard = keyboard + endif + let s:starts.column = start_column + return start_column +else + if s:omni < 0 " one_key_correction + return [s:space] + endif + let results = s:vimim_cache() + if empty(results) + sil!call s:vimim_reset_before_omni() + else + return s:vimim_popupmenu_list(results) + endif + let keyboard = a:keyboard + if !empty(str2nr(keyboard)) " for digit input: 23554022100080204420 + let keyboard = get(split(s:keyboard),0) + endif + if empty(keyboard) || keyboard !~ valid_keyboard + return [] + else " [english] first check if it is english or not + let s:english.line = s:vimim_get_english(keyboard) + endif + if s:mode.onekey || s:mode.windowless + let results = s:vimim_get_hjkl_game(keyboard) + if empty(results) && s:vimim_cjk() + let head = s:vimim_get_no_quote_head(keyboard) + let head = s:vimim_get_cjk_head(head) + let results = !empty(head) ? s:vimim_cjk_match(head) : [] + endif + if len(results) + return s:vimim_popupmenu_list(results) + elseif len(s:hjkl) && s:keyboard !~ "'" + let keyboard = get(split(keyboard,'\d'),0) " mali74 + elseif get(split(s:keyboard),1) =~ "'" " ssss.. for cloud + let keyboard = s:vimim_get_no_quote_head(keyboard) + endif + endif + if s:ui.im == "mycloud" + let results = s:vimim_get_mycloud(keyboard) + if len(results) + let s:show_extra_menu = 1 + return s:vimim_popupmenu_list(results) + else " flat failure from mycloud + sil!call s:vimim_debug('mycloud fatal', keyboard, v:exception) + return [] + endif + endif + if !empty(g:vimim_shuangpin) && g:vimim_cloud !~ 'shuangpin' + if empty(s:shuangpin_table) + let rules = s:vimim_shuangpin_generic() + let rules = s:vimim_shuangpin_rules(g:vimim_shuangpin, rules) + let s:shuangpin_table = s:vimim_create_shuangpin_table(rules) + endif + if empty(s:has_shuangpin_transform) + let keyboard = s:vimim_shuangpin_transform(keyboard) + let s:keyboard = keyboard + endif + endif + if s:ui.root == 'cloud' || keyboard[-1:] == "'" && empty(s:ui.quote) + let results = s:vimim_get_cloud(keyboard, s:cloud) + endif + if empty(results) + if s:wubi && len(keyboard) > 4 + let keyboard = strpart(keyboard, 4*((len(keyboard)-1)/4)) + let s:keyboard = keyboard " wubi auto insert on the 4th + endif " [backend] plug-n-play embedded file/directory engine + let results = s:vimim_embedded_backend_engine(keyboard) + endif + if len(s:english.line) + let s:keyboard = s:keyboard !~ "'" ? keyboard : s:keyboard + let results = s:vimim_make_pairs(s:english.line) + results + endif + if empty(results) " [the_last_resort] force shoupin or force cloud + if s:mode.onekey || s:mode.windowless + if len(keyboard) > 1 + let shoupin = s:vimim_get_no_quote_head(keyboard."'''") + let results = s:vimim_cjk_match(shoupin) + if empty(results) + let results = s:vimim_get_cloud(keyboard, s:cloud) + endif + else + let results = [keyboard == 'i' ? "我" : s:space] + endif + elseif s:mode.static + let s:pattern_not_found = 1 + endif + endif + return s:vimim_popupmenu_list(results) +endif +endfunction + +function! s:vimim_popupmenu_list(lines) + let s:match_list = a:lines + let keyboards = split(s:keyboard) " mmmm => ['m',"m'm'm"] + let keyboard = join(keyboards,"") + let tail = len(keyboards) < 2 ? "" : get(keyboards,1) + if empty(a:lines) || type(a:lines) != type([]) + return [] + elseif s:vimim_cjk() && len(s:hjkl) + let results = [] " use 1234567890 as filter for windowless + for chinese in a:lines + if s:vimim_cjk_in_4corner(chinese,0) + call add(results, chinese) + endif + endfor + if empty(results) + let s:hjkl = "" " make digits recyclable + else " gi ma space 7777777777 + let s:match_list = results + endif + endif + let label = 1 + let one_list = [] + let s:popup_list = [] + for chinese in s:match_list + let complete_items = {} + if s:vimim_cjk() && s:hjkl__ && s:hjkl__%2 + let simplified_traditional = "" + for char in split(chinese, '\zs') + let simplified_traditional .= s:vimim_1to1(char) + endfor + let chinese = simplified_traditional + endif + let titleline = s:vimim_get_label(label) + if empty(s:touch_me_not) + let menu = "" + let pairs = split(chinese) + let pair_left = get(pairs,0) + if len(pairs) > 1 && pair_left !~ '[^\x00-\xff]' + let chinese = get(pairs,1) + let menu = s:show_extra_menu ? pair_left : menu + endif + if s:hjkl_h && s:hjkl_h % 2 + let char = get(split(chinese,'\zs'),0) + let menu = s:vimim_cjk_property(char) + endif + let label2 = s:english.line =~ chinese ? '*' : ' ' + let titleline = printf('%3s ', label2 . titleline) + let chinese .= empty(tail) || tail == "'" ? '' : tail + let complete_items["abbr"] = titleline . chinese + let complete_items["menu"] = menu + endif + if s:mode.windowless + if s:vimim_cjk() " display sexy english and dynamic 4corner + let star = substitute(titleline,'[0-9a-z_ ]','','g') + let digit = s:vimim_cjk_in_4corner(chinese,1) " ma7 712 + let titleline = star . digit[len(s:hjkl) : 3] + elseif label < 11 " 234567890 for windowless selection + let titleline = label == 10 ? "0" : label + endif + call add(one_list, titleline . chinese) + endif + let label += 1 + let complete_items["dup"] = 1 + let complete_items["word"] = empty(chinese) ? s:space : chinese + call add(s:popup_list, complete_items) + endfor + if s:mode.windowless + let s:windowless_title = 'VimIM ' . keyboard .' '. join(one_list) + call s:vimim_windowless_titlestring(1) + endif + call s:vimim_set_pumheight() + Debug s:match_list[:1] + return s:popup_list +endfunction + +function! s:vimim_embedded_backend_engine(keyboard) + let keyboard = a:keyboard + if empty(s:ui.im) || empty(s:ui.root) + return [] + endif + let head = 0 + let results = [] + let backend = s:backend[s:ui.root][s:ui.im] + if backend.name =~ "quote" && keyboard !~ "[']" " has apostrophe + let keyboard = s:vimim_quanpin_transform(keyboard) + endif + if s:ui.root =~# "directory" + let head = s:vimim_sentence_directory(keyboard, backend.name) + let results = s:vimim_readfile(backend.name . head) + if keyboard ==# head && len(results) && len(results) < 20 + let extras = [] + for candidate in s:vimim_more_pinyin_candidates(keyboard) + let lines = s:vimim_readfile(backend.name . candidate) + let extras += map(lines, 'candidate." ".v:val') + endfor + let results = extras + map(results, 'keyboard." ".v:val') + endif + elseif s:ui.root =~# "datafile" + if backend.name =~ "bsddb" + if empty(backend.lines) + let backend.lines = ["4MB_in_memory_46MB_on_disk"] + sil!call s:vimim_initialize_bsddb(backend.name) + endif + let head = s:vimim_get_stone_from_bsddb(keyboard) + if !empty(head) + let results = s:vimim_get_from_database(head) + endif + else + if empty(backend.lines) + let backend.lines = s:vimim_readfile(backend.name) + endif + let head = s:vimim_sentence_datafile(keyboard) + let results = s:vimim_get_from_datafile(head) + endif + endif + if s:keyboard !~ '\S\s\S' + if empty(head) + let s:keyboard = keyboard + elseif len(head) < len(keyboard) + let tail = strpart(keyboard,len(head)) + let s:keyboard = head . " " . tail + endif + endif + return results +endfunction + +function! g:vimim() + let s:omni = s:omni < 0 ? -1 : 0 " one_key_correction + let s:keyboard = empty(s:pageup_pagedown) ? "" : s:keyboard + let key = s:vimim_left() ? '\\\=g:omni()\' : "" + sil!exe 'sil!return "' . key . '"' +endfunction + +function! g:omni() + let s:omni = s:omni < 0 ? 0 : 1 " as if omni completion pattern found + let key = s:mode.static ? '\\' : '\\' + let key = pumvisible() ? key : "" + sil!exe 'sil!return "' . key . '"' +endfunction + +" ============================================= }}} +let s:VimIM += [" ==== core driver ==== {{{"] +" ================================================= + +function! s:vimim_plug_and_play() + nnoremap i=g:vimim_chinese() + inoremap =g:vimim_chinese() + inoremap =g:vimim_onekey() + xnoremap y:call g:vimim_visual() + if g:vimim_map !~ 'no-gi' + nnoremap gi a=g:vimim_gi() + xmap gi + endif + if g:vimim_map !~ 'no-search' + nnoremap n :call g:vimim_search()n + endif + if g:vimim_map =~ 'c-bslash' " use Ctrl-\ '' + imap + nmap + elseif g:vimim_map =~ 'c-space' " use Ctrl-Space + if has("win32unix") + nmap + imap + else + imap + nmap + endif + elseif g:vimim_map =~ 'm-space' " use Alt-Space + imap + nmap + endif + if g:vimim_map =~ 'tab' " use Tab + xmap + if g:vimim_map =~ 'tab_as_gi' + inoremap =g:vimim_tab(1) + elseif g:vimim_map =~ 'tab_as_onekey' + inoremap =g:vimim_tab(0) + endif + endif + :com! -range=% ViMiM ,call s:vimim_chinese_rotation() + :com! -range=% VimIM ,call s:vimim_chinese_transfer() + :com! -nargs=* Debug :sil!call s:vimim_debug() +endfunction + +sil!call s:vimim_initialize_debug() +sil!call s:vimim_initialize_global() +sil!call s:vimim_initialize_backdoor() +sil!call s:vimim_dictionary_statusline() +sil!call s:vimim_dictionary_punctuations() +sil!call s:vimim_dictionary_numbers() +sil!call s:vimim_dictionary_keycodes() +sil!call s:vimim_super_reset() +sil!call s:vimim_set_backend_clouds() +sil!call s:vimim_set_backend_embedded() +sil!call s:vimim_set_backend_mycloud() +sil!call s:vimim_set_im_toggle_list() +sil!call s:vimim_plug_and_play() +:let g:vimim_profile = reltime(g:vimim_profile) +" ============================================= }}} +:redir @p +Debug s:vimim_egg_vimim() diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim new file mode 100644 index 00000000..636d2af7 --- /dev/null +++ b/syntax/nerdtree.vim @@ -0,0 +1,88 @@ +let s:tree_up_dir_line = '.. (up a dir)' +"NERDTreeFlags are syntax items that should be invisible, but give clues as to +"how things should be highlighted +syn match NERDTreeFlag #\~# +syn match NERDTreeFlag #\[RO\]# + +"highlighting for the .. (up dir) line at the top of the tree +execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#" + +"highlighting for the ~/+ symbols for the directory nodes +syn match NERDTreeClosable #\~\<# +syn match NERDTreeClosable #\~\.# +syn match NERDTreeOpenable #+\<# +syn match NERDTreeOpenable #+\.#he=e-1 + +"highlighting for the tree structural parts +syn match NERDTreePart #|# +syn match NERDTreePart #`# +syn match NERDTreePartFile #[|`]-#hs=s+1 contains=NERDTreePart + +"quickhelp syntax elements +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#hs=s+2,he=e-1 +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#hs=s+2,he=e-1 +syn match NERDTreeHelpTitle #" .*\~#hs=s+2,he=e-1 contains=NERDTreeFlag +syn match NERDTreeToggleOn #".*(on)#hs=e-2,he=e-1 contains=NERDTreeHelpKey +syn match NERDTreeToggleOff #".*(off)#hs=e-3,he=e-1 contains=NERDTreeHelpKey +syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3 +syn match NERDTreeHelp #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeFlag,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand + +"highlighting for readonly files +syn match NERDTreeRO #.*\[RO\]#hs=s+2 contains=NERDTreeFlag,NERDTreeBookmark,NERDTreePart,NERDTreePartFile + +"highlighting for sym links +syn match NERDTreeLink #[^-| `].* -> # contains=NERDTreeBookmark,NERDTreeOpenable,NERDTreeClosable,NERDTreeDirSlash + +"highlighing for directory nodes and file nodes +syn match NERDTreeDirSlash #/# +syn match NERDTreeDir #[^-| `].*/# contains=NERDTreeLink,NERDTreeDirSlash,NERDTreeOpenable,NERDTreeClosable +syn match NERDTreeExecFile #[|` ].*\*\($\| \)# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark +syn match NERDTreeFile #|-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile +syn match NERDTreeFile #`-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile +syn match NERDTreeCWD #^[# +syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader + +if exists("g:NERDChristmasTree") && g:NERDChristmasTree + hi def link NERDTreePart Special + hi def link NERDTreePartFile Type + hi def link NERDTreeFile Normal + hi def link NERDTreeExecFile Title + hi def link NERDTreeDirSlash Identifier + hi def link NERDTreeClosable Type +else + hi def link NERDTreePart Normal + hi def link NERDTreePartFile Normal + hi def link NERDTreeFile Normal + hi def link NERDTreeClosable Title +endif + +hi def link NERDTreeBookmarksHeader statement +hi def link NERDTreeBookmarksLeader ignore +hi def link NERDTreeBookmarkName Identifier +hi def link NERDTreeBookmark normal + +hi def link NERDTreeHelp String +hi def link NERDTreeHelpKey Identifier +hi def link NERDTreeHelpCommand Identifier +hi def link NERDTreeHelpTitle Macro +hi def link NERDTreeToggleOn Question +hi def link NERDTreeToggleOff WarningMsg + +hi def link NERDTreeDir Directory +hi def link NERDTreeUp Directory +hi def link NERDTreeCWD Statement +hi def link NERDTreeLink Macro +hi def link NERDTreeOpenable Title +hi def link NERDTreeFlag ignore +hi def link NERDTreeRO WarningMsg +hi def link NERDTreeBookmark Statement + +hi def link NERDTreeCurrentNode Search diff --git a/syntax/python.vim b/syntax/python.vim new file mode 100644 index 00000000..dc76bb6b --- /dev/null +++ b/syntax/python.vim @@ -0,0 +1,374 @@ +" Vim syntax file +" Language: Python +" Maintainer: Dmitry Vasiliev +" URL: https://github.com/hdima/vim-scripts/blob/master/syntax/python/python.vim +" Last Change: 2012-02-11 +" Filenames: *.py +" Version: 2.6.7 +" +" Based on python.vim (from Vim 6.1 distribution) +" by Neil Schemenauer +" +" Thanks: +" +" Jeroen Ruigrok van der Werven +" for the idea to highlight erroneous operators +" Pedro Algarvio +" for the patch to enable spell checking only for the right spots +" (strings and comments) +" John Eikenberry +" for the patch fixing small typo +" Caleb Adamantine +" for the patch fixing highlighting for decorators +" Andrea Riciputi +" for the patch with new configuration options + +" +" Options: +" +" For set option do: let OPTION_NAME = 1 +" For clear option do: let OPTION_NAME = 0 +" +" Option names: +" +" For highlight builtin functions and objects: +" python_highlight_builtins +" +" For highlight builtin objects: +" python_highlight_builtin_objs +" +" For highlight builtin funtions: +" python_highlight_builtin_funcs +" +" For highlight standard exceptions: +" python_highlight_exceptions +" +" For highlight string formatting: +" python_highlight_string_formatting +" +" For highlight str.format syntax: +" python_highlight_string_format +" +" For highlight string.Template syntax: +" python_highlight_string_templates +" +" For highlight indentation errors: +" python_highlight_indent_errors +" +" For highlight trailing spaces: +" python_highlight_space_errors +" +" For highlight doc-tests: +" python_highlight_doctests +" +" If you want all Python highlightings above: +" python_highlight_all +" (This option not override previously set options) +" +" For fast machines: +" python_slow_sync +" +" For "print" builtin as function: +" python_print_as_function + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +if exists("python_highlight_all") && python_highlight_all != 0 + " Not override previously set options + if !exists("python_highlight_builtins") + if !exists("python_highlight_builtin_objs") + let python_highlight_builtin_objs = 1 + endif + if !exists("python_highlight_builtin_funcs") + let python_highlight_builtin_funcs = 1 + endif + endif + if !exists("python_highlight_exceptions") + let python_highlight_exceptions = 1 + endif + if !exists("python_highlight_string_formatting") + let python_highlight_string_formatting = 1 + endif + if !exists("python_highlight_string_format") + let python_highlight_string_format = 1 + endif + if !exists("python_highlight_string_templates") + let python_highlight_string_templates = 1 + endif + if !exists("python_highlight_indent_errors") + let python_highlight_indent_errors = 1 + endif + if !exists("python_highlight_space_errors") + let python_highlight_space_errors = 1 + endif + if !exists("python_highlight_doctests") + let python_highlight_doctests = 1 + endif +endif + +" Keywords +syn keyword pythonStatement break continue del +syn keyword pythonStatement exec return +syn keyword pythonStatement pass raise +syn keyword pythonStatement global assert +syn keyword pythonStatement lambda yield +syn keyword pythonStatement with +syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite +syn match pythonFunction "[a-zA-Z_][a-zA-Z0-9_]*" display contained +syn keyword pythonRepeat for while +syn keyword pythonConditional if elif else +syn keyword pythonPreCondit import from as +syn keyword pythonException try except finally +syn keyword pythonOperator and in is not or + +if !exists("python_print_as_function") || python_print_as_function == 0 + syn keyword pythonStatement print +endif + +" Decorators (new in Python 2.4) +syn match pythonDecorator "@" display nextgroup=pythonDottedName skipwhite +syn match pythonDottedName "[a-zA-Z_][a-zA-Z0-9_]*\(\.[a-zA-Z_][a-zA-Z0-9_]*\)*" display contained +syn match pythonDot "\." display containedin=pythonDottedName + +" Comments +syn match pythonComment "#.*$" display contains=pythonTodo,@Spell +syn match pythonRun "\%^#!.*$" +syn match pythonCoding "\%^.*\(\n.*\)\?#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$" +syn keyword pythonTodo TODO FIXME XXX contained + +" Errors +syn match pythonError "\<\d\+\D\+\>" display +syn match pythonError "[$?]" display +syn match pythonError "[&|]\{2,}" display +syn match pythonError "[=]\{3,}" display + +" TODO: Mixing spaces and tabs also may be used for pretty formatting multiline +" statements. For now I don't know how to work around this. +if exists("python_highlight_indent_errors") && python_highlight_indent_errors != 0 + syn match pythonIndentError "^\s*\( \t\|\t \)\s*\S"me=e-1 display +endif + +" Trailing space errors +if exists("python_highlight_space_errors") && python_highlight_space_errors != 0 + syn match pythonSpaceError "\s\+$" display +endif + +" Strings +syn region pythonString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonEscape,pythonEscapeError,@Spell +syn region pythonString start=+[bB]\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonEscape,pythonEscapeError,@Spell +syn region pythonString start=+[bB]\="""+ end=+"""+ keepend contains=pythonEscape,pythonEscapeError,pythonDocTest2,pythonSpaceError,@Spell +syn region pythonString start=+[bB]\='''+ end=+'''+ keepend contains=pythonEscape,pythonEscapeError,pythonDocTest,pythonSpaceError,@Spell + +syn match pythonEscape +\\[abfnrtv'"\\]+ display contained +syn match pythonEscape "\\\o\o\=\o\=" display contained +syn match pythonEscapeError "\\\o\{,2}[89]" display contained +syn match pythonEscape "\\x\x\{2}" display contained +syn match pythonEscapeError "\\x\x\=\X" display contained +syn match pythonEscape "\\$" + +" Unicode strings +syn region pythonUniString start=+[uU]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,@Spell +syn region pythonUniString start=+[uU]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,@Spell +syn region pythonUniString start=+[uU]"""+ end=+"""+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell +syn region pythonUniString start=+[uU]'''+ end=+'''+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell + +syn match pythonUniEscape "\\u\x\{4}" display contained +syn match pythonUniEscapeError "\\u\x\{,3}\X" display contained +syn match pythonUniEscape "\\U\x\{8}" display contained +syn match pythonUniEscapeError "\\U\x\{,7}\X" display contained +syn match pythonUniEscape "\\N{[A-Z ]\+}" display contained +syn match pythonUniEscapeError "\\N{[^A-Z ]\+}" display contained + +" Raw strings +syn region pythonRawString start=+[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell +syn region pythonRawString start=+[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell +syn region pythonRawString start=+[rR]"""+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell +syn region pythonRawString start=+[rR]'''+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + +syn match pythonRawEscape +\\['"]+ display transparent contained + +" Unicode raw strings +syn region pythonUniRawString start=+[uU][rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell +syn region pythonUniRawString start=+[uU][rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell +syn region pythonUniRawString start=+[uU][rR]"""+ end=+"""+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest2,pythonSpaceError,@Spell +syn region pythonUniRawString start=+[uU][rR]'''+ end=+'''+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest,pythonSpaceError,@Spell + +syn match pythonUniRawEscape "\([^\\]\(\\\\\)*\)\@<=\\u\x\{4}" display contained +syn match pythonUniRawEscapeError "\([^\\]\(\\\\\)*\)\@<=\\u\x\{,3}\X" display contained + +if exists("python_highlight_string_formatting") && python_highlight_string_formatting != 0 + " String formatting + syn match pythonStrFormatting "%\(([^)]\+)\)\=[-#0 +]*\d*\(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString + syn match pythonStrFormatting "%[-#0 +]*\(\*\|\d\+\)\=\(\.\(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString +endif + +if exists("python_highlight_string_format") && python_highlight_string_format != 0 + " str.format syntax + syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString + syn match pythonStrFormat "{\([a-zA-Z_][a-zA-Z0-9_]*\|\d\+\)\(\.[a-zA-Z_][a-zA-Z0-9_]*\|\[\(\d\+\|[^!:\}]\+\)\]\)*\(![rs]\)\=\(:\({\([a-zA-Z_][a-zA-Z0-9_]*\|\d\+\)}\|\([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*\(\.\d\+\)\=[bcdeEfFgGnoxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString +endif + +if exists("python_highlight_string_templates") && python_highlight_string_templates != 0 + " String templates + syn match pythonStrTemplate "\$\$" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString + syn match pythonStrTemplate "\${[a-zA-Z_][a-zA-Z0-9_]*}" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString + syn match pythonStrTemplate "\$[a-zA-Z_][a-zA-Z0-9_]*" contained containedin=pythonString,pythonUniString,pythonRawString,pythonUniRawString +endif + +if exists("python_highlight_doctests") && python_highlight_doctests != 0 + " DocTests + syn region pythonDocTest start="^\s*>>>" end=+'''+he=s-1 end="^\s*$" contained + syn region pythonDocTest2 start="^\s*>>>" end=+"""+he=s-1 end="^\s*$" contained +endif + +" Numbers (ints, longs, floats, complex) +syn match pythonHexError "\<0[xX]\x*[g-zG-Z]\x*[lL]\=\>" display + +syn match pythonHexNumber "\<0[xX]\x\+[lL]\=\>" display +syn match pythonOctNumber "\<0[oO]\o\+[lL]\=\>" display +syn match pythonBinNumber "\<0[bB][01]\+[lL]\=\>" display + +syn match pythonNumber "\<\d\+[lLjJ]\=\>" display + +syn match pythonFloat "\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>" display +syn match pythonFloat "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display +syn match pythonFloat "\<\d\+\.\d*\([eE][+-]\=\d\+\)\=[jJ]\=" display + +syn match pythonOctError "\<0[oO]\=\o*[8-9]\d*[lL]\=\>" display +syn match pythonBinError "\<0[bB][01]*[2-9]\d*[lL]\=\>" display + +if exists("python_highlight_builtin_objs") && python_highlight_builtin_objs != 0 + " Builtin objects and types + syn keyword pythonBuiltinObj True False Ellipsis None NotImplemented + syn keyword pythonBuiltinObj __debug__ __doc__ __file__ __name__ __package__ +endif + +if exists("python_highlight_builtin_funcs") && python_highlight_builtin_funcs != 0 + " Builtin functions + syn keyword pythonBuiltinFunc __import__ abs all any apply + syn keyword pythonBuiltinFunc basestring bin bool buffer bytearray bytes callable + syn keyword pythonBuiltinFunc chr classmethod cmp coerce compile complex + syn keyword pythonBuiltinFunc delattr dict dir divmod enumerate eval + syn keyword pythonBuiltinFunc execfile file filter float format frozenset getattr + syn keyword pythonBuiltinFunc globals hasattr hash help hex id + syn keyword pythonBuiltinFunc input int intern isinstance + syn keyword pythonBuiltinFunc issubclass iter len list locals long map max + syn keyword pythonBuiltinFunc min next object oct open ord + syn keyword pythonBuiltinFunc pow property range + syn keyword pythonBuiltinFunc raw_input reduce reload repr + syn keyword pythonBuiltinFunc reversed round set setattr + syn keyword pythonBuiltinFunc slice sorted staticmethod str sum super tuple + syn keyword pythonBuiltinFunc type unichr unicode vars xrange zip + + if exists("python_print_as_function") && python_print_as_function != 0 + syn keyword pythonBuiltinFunc print + endif +endif + +if exists("python_highlight_exceptions") && python_highlight_exceptions != 0 + " Builtin exceptions and warnings + syn keyword pythonExClass BaseException + syn keyword pythonExClass Exception StandardError ArithmeticError + syn keyword pythonExClass LookupError EnvironmentError + + syn keyword pythonExClass AssertionError AttributeError BufferError EOFError + syn keyword pythonExClass FloatingPointError GeneratorExit IOError + syn keyword pythonExClass ImportError IndexError KeyError + syn keyword pythonExClass KeyboardInterrupt MemoryError NameError + syn keyword pythonExClass NotImplementedError OSError OverflowError + syn keyword pythonExClass ReferenceError RuntimeError StopIteration + syn keyword pythonExClass SyntaxError IndentationError TabError + syn keyword pythonExClass SystemError SystemExit TypeError + syn keyword pythonExClass UnboundLocalError UnicodeError + syn keyword pythonExClass UnicodeEncodeError UnicodeDecodeError + syn keyword pythonExClass UnicodeTranslateError ValueError VMSError + syn keyword pythonExClass WindowsError ZeroDivisionError + + syn keyword pythonExClass Warning UserWarning BytesWarning DeprecationWarning + syn keyword pythonExClass PendingDepricationWarning SyntaxWarning + syn keyword pythonExClass RuntimeWarning FutureWarning + syn keyword pythonExClass ImportWarning UnicodeWarning +endif + +if exists("python_slow_sync") && python_slow_sync != 0 + syn sync minlines=2000 +else + " This is fast but code inside triple quoted strings screws it up. It + " is impossible to fix because the only way to know if you are inside a + " triple quoted string is to start from the beginning of the file. + syn sync match pythonSync grouphere NONE "):$" + syn sync maxlines=200 +endif + +if version >= 508 || !exists("did_python_syn_inits") + if version <= 508 + let did_python_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink pythonStatement Statement + HiLink pythonPreCondit Statement + HiLink pythonFunction Function + HiLink pythonConditional Conditional + HiLink pythonRepeat Repeat + HiLink pythonException Exception + HiLink pythonOperator Operator + + HiLink pythonDecorator Define + HiLink pythonDottedName Function + HiLink pythonDot Normal + + HiLink pythonComment Comment + HiLink pythonCoding Special + HiLink pythonRun Special + HiLink pythonTodo Todo + + HiLink pythonError Error + HiLink pythonIndentError Error + HiLink pythonSpaceError Error + + HiLink pythonString String + HiLink pythonUniString String + HiLink pythonRawString String + HiLink pythonUniRawString String + + HiLink pythonEscape Special + HiLink pythonEscapeError Error + HiLink pythonUniEscape Special + HiLink pythonUniEscapeError Error + HiLink pythonUniRawEscape Special + HiLink pythonUniRawEscapeError Error + + HiLink pythonStrFormatting Special + HiLink pythonStrFormat Special + HiLink pythonStrTemplate Special + + HiLink pythonDocTest Special + HiLink pythonDocTest2 Special + + HiLink pythonNumber Number + HiLink pythonHexNumber Number + HiLink pythonOctNumber Number + HiLink pythonBinNumber Number + HiLink pythonFloat Float + HiLink pythonOctError Error + HiLink pythonHexError Error + HiLink pythonBinError Error + + HiLink pythonBuiltinObj Structure + HiLink pythonBuiltinFunc Function + + HiLink pythonExClass Structure + + delcommand HiLink +endif + +let b:current_syntax = "python"