环境说明

系统版本:centos7、Ubuntu16

vim版本:7.4

安装git工具

整体说明:本文的vim配置是针对Linux的单个系统用户,python的自动补全使用的是 jedi-vim 插件

适用:Linux系统(centos,Redhat,Ubuntu等等)

自定义IDE

关于自定义IDE,每个人的需求不同,这里配置shell和python的环境,python为主。这里将自定义拆分为四部分,.vimrc为基础文件,调用其他三个文件的配置,.vimrc.bundles文件为自定义功能部分;vim_header为自定义文件头,该文件还可以自动更新文件的最新修改时间;run_file为在vim编辑器下直接运行文件,不用退出再运行。

自定义基础文件

.vimrc主要是加载其他三个文件的配置和自动更新文件种类修改时间的判断

点击查看.vimrc文件详细内容

```shell
" ~/.vimrc 用户vim配置
" 关于更新时间说明:退出时按 'wq' 自动更新时间,不论是否有修改;按 'x' 则文件有修改时更新, 按 'q' 更新时间无变化
" modify the last modified time of a file
function SetLastModifiedTime(lineno)
let modif_time = strftime("%Y-%m-%d %H:%M:%S")
if a:lineno == "-1"
let line = getline(10)
else
let line = getline(a:lineno)
endif
if line =~ '\sLast Modified:'
let line = strpart(line, 0, stridx(line, ":")) . ": " . modif_time
endif if a:lineno == "-1"
call setline(10, line)
else
call append(a:lineno, line)
endif

endfunc

" 修改shell脚本的更新时间

function SetLastModifiedTime_sh(lineno_sh)

let modif_time_sh = strftime("%Y-%m-%d %H:%M:%S")

if a:lineno_sh == "-2"

let line_sh = getline(9)

else

let line_sh = getline(a:lineno_sh)

endif

if line_sh =~ '\sLast Changed:'
let line_sh = strpart(line_sh, 0, stridx(line_sh, ":")) . ": " . modif_time_sh
endif if a:lineno_sh == "-2"
call setline(9, line_sh)
else
call append(a:lineno_sh, line_sh)
endif

endfunc

" map the SetLastModifiedTime command automatically

autocmd BufWrite *.py call SetLastModifiedTime(-1)

autocmd BufWrite *.sh call SetLastModifiedTime_sh(-2)

" 加载文件头模板

run vim_header_model/vim_header

" 加载自己定义的语言编辑器配置,包括python,shell

if filereadable(expand("~/.vimrc.bundles"))

source ~/.vimrc.bundles

endif

if filereadable(expand("~/.vimrc.run_file"))

source ~/.vimrc.run_file

endif

</code></pre>
</details> ## 自定义文件头部信息
自定义文件头部内容,加了一个自动修改文件的最后更新时间 <details>
<summary>点击查看vim_header文件详细内容</summary>
<pre><code>
```shell
" 用户vim配置调用模板,路径:~/.vim/vim_header_model/vim_header ,这里自定义了shell和python的文件头信息
autocmd BufNewFile *.cc,*.sh,*.java,*.cpp,*.h,*.hpp,*.py,*.lua exec ":call SetTitle()" "定义函数SetTitle,自动插入文件头
func SetTitle()
let filetype_name = strpart(expand("%"), stridx(expand("%"), "."))
let file_name = strpart(expand("%"), 0, stridx(expand("%"), "."))
if file_name =~ "\/"
let file_name = strpart(file_name, strridx(file_name, "/") + 1)
endif
let time_value = strftime("%Y-%m-%d %H:%M:%S")
if filetype_name == ".sh"
call setline(1, "\#!/bin/bash")
call append(line("."), "")
call append(line(".")+1, "\#########################################################################")
call append(line(".")+2, "\# File Name: ". file_name . filetype_name)
call append(line(".")+3, "\# file_path: ")
call append(line(".")+4, "\# Author: 浪子尘心")
call append(line(".")+5, "\# Mail: 536418286@qq.com")
call append(line(".")+6, "\# Created Time: ".time_value)
call append(line(".")+7, "\# Last Changed: ".time_value)
call append(line(".")+8, "\# Description: ")
call append(line(".")+9, "\# Version: ")
call append(line(".")+10, "\#########################################################################")
call append(line(".")+11, "")
call append(line(".")+12, "")
else
if filetype_name == ".py"
call setline(1, "\#!/usr/bin/env python")
call setline(2, "\# -*- coding: utf-8 -*-")
call append(line(".")+1, "")
call append(line(".")+2, "\#########################################################################")
call append(line(".")+3, "\# File Name: ". file_name . filetype_name)
call append(line(".")+4, "\# file_path: ")
call append(line(".")+5, "\# Author: 浪子尘心")
call append(line(".")+6, "\# Mail: 536418286@qq.com")
call append(line(".")+7, "\# Created Time: ".time_value)
call append(line(".")+8, "\# Last Modified: ".time_value)
call append(line(".")+9, "\# Description: ")
call append(line(".")+10, "\# Version: ")
call append(line(".")+11, "\#########################################################################")
call append(line(".")+12, "")
call append(line(".")+13, "")
endif
endif
endfunc

自定义编辑器

这里给出我自己的模板,各位可以根据模板自行修改,文末给出部分效果图,更多使用自行发现。

插件管理使用的是plug,对比其他管理插件之后,个人感觉该管理插件功能最强大

点击查看.vimrc.bundles文件详细内容

```shell
call plug#begin('~/.vim/plugged') "添加nerdtree插件,目录树插件

Plug 'scrooloose/nerdtree'

" NerdTree文件类型高亮

Plug 'tiagofumo/vim-nerdtree-syntax-highlight'

" 显示文件类型图标

Plug 'ryanoasis/vim-devicons'

" 更换主题,这个插件拥有更多主题可选,而且远程和本机操作均有效

Plug 'chxuan/change-colorscheme'

" 添加代码补全插件,YouCompleteMe 插件比 Jedi-vim 功能更丰富,但是由于YCM太笨重,安装可以考虑jedi-vim

Plug 'davidhalter/jedi-vim'

Plug 'ervandew/supertab'

"代码折叠插件

Plug 'tmhedberg/SimpylFold'

" 比ctrlp更强大的文件的模糊搜索工具,要求vim版本大于7.4.330+

"Plug 'Yggdroot/LeaderF'

"在vim的normal模式下的文本搜索工具,normal模式就是ESC按键之后的模式,这个插件比ctrlp更强大的文件的模糊搜索工具

Plug 'mileszs/ack.vim'

"比Powerline更好的状态栏显示插件,可以显示当前的虚拟环境、Git分支、正在编辑的文件等信息

Plug 'vim-airline/vim-airline'

" 状态栏主题颜色插件,背景插件

Plug 'itchyny/lightline.vim'

Plug 'joshdick/onedark.vim'

" 文件图标下载

Plug 'ryanoasis/vim-devicons'

" vim-airline 主题插件

Plug 'vim-airline/vim-airline-themes'

" Git集成,可以在Vim中执行基本的Git命令

Plug 'tpope/vim-fugitive'

" 为nerdtree添加git支持

Plug 'Xuyuanp/nerdtree-git-plugin'

" Markdown语法高亮插件

Plug 'godlygeek/tabular'

Plug 'plasticboy/vim-markdown'

" 显示缩进对齐线插件

Plug 'Yggdroot/indentLine'

" 代码片段补全

Plug 'honza/vim-snippets'

" 让翻页更顺畅

Plug 'terryma/vim-smooth-scroll'

" 自动化格式代码工具

Plug 'Chiel92/vim-autoformat'

call plug#end() " 通用设置

set nocompatible " 设置不兼容原始vi模式

filetype on " 设置开启文件类型侦测

filetype plugin on " 设置加载对应文件类型的插件

set noeb " 关闭错误的提示

syntax enable " 开启语法高亮功能

syntax on " 自动语法高亮

set t_Co=256 " 开启256色支持

set cmdheight=2 " 设置命令行的高度

set showcmd " select模式下显示选中的行数

set ruler " 总是显示光标位置

set laststatus=2 " 总是显示状态栏

set number " 开启行号显示

set cursorline " 高亮显示当前行

set whichwrap+=<,>,h,l " 设置光标键跨行

set ttimeoutlen=0 " 设置键响应时间

set virtualedit=block,onemore " 允许光标出现在最后一个字符的后面

"set paste " 关闭自动注释

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 代码缩进和排版

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

set autoindent " 设置自动缩进

set cindent " 设置使用C/C++语言的自动缩进方式

set cinoptions=g0,:0,N-s,(0 " 设置C/C++语言的具体缩进方式

set smartindent " 智能的选择对其方式

filetype indent on " 自适应不同语言的智能缩进

set expandtab " 将制表符扩展为空格

set tabstop=4 " 设置编辑时制表符占用空格数

set shiftwidth=4 " 设置格式化时制表符占用空格数

set softtabstop=4 " 设置4个空格为制表符

set smarttab " 在行和段开始处使用制表符

set nowrap " 禁止折行

set backspace=2 " 使用回车键正常处理indent,eol,start等

set sidescroll=10 " 设置向右滚动字符数

set nofoldenable " 禁用折叠代码 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 代码补全

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

set wildmenu " vim自身命名行模式智能补全

" 补全时不显示窗口,只显示补全列表,默认补全时显示补全的功能

" set completeopt-=preview """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 搜索设置

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

set hlsearch " 高亮显示搜索结果

set incsearch " 开启实时搜索功能

set ignorecase " 搜索时大小写不敏感 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 缓存设置

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

set nobackup " 设置不备份

set noswapfile " 禁止生成临时文件

set autoread " 文件在vim之外修改过,自动重新读入

set autowrite " 设置自动保存

set confirm " 在处理未保存或只读文件的时候,弹出确认 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 编码设置

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

set langmenu=zh_CN.UTF-8

set helplang=cn

set termencoding=utf-8

set encoding=utf8

set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030 "高亮显示行伟不必要的空白字符

highlight Whitespace ctermbg=red guibg=red

au BufRead,BufNewFile .py,.pyw,.c,.h,*.sh match Whitespace /\s+$\ +/ " 打开文件自动定位到最后编辑的位置

autocmd BufReadPost * if line("'"") > 1 && line("'"") <= line("$") | execute "normal! g'"" | endif " shell 风格

au BufNewFile,BufRead *.sh set tabstop=4 "tab 长度设置为 4

au BufNewFile,BufRead *.sh set nobackup "覆盖文件时不备份 "********************插件配置设置****************

" 主题

set background=dark

let g:onedark_termcolors=256

colorscheme onedark " airline

let g:airline_theme="onedark"

let g:airline_powerline_fonts = 1

let g:airline#extensions#tabline#enabled = 1

if !exists('g:airline_symbols')

let g:airline_symbols = {}

endif

let g:airline_left_sep = ''

let g:airline_left_alt_sep = ''

let g:airline_right_sep = ''

let g:airline_right_alt_sep = '' " nerdtree-git-plug

let g:NERDTreeIndicatorMapCustom = {

\ "Modified" : "✹",

\ "Staged" : "✚",

\ "Untracked" : "✭",

\ "Renamed" : "➜",

\ "Unmerged" : "═",

\ "Deleted" : "✖",

\ "Dirty" : "✗",

\ "Clean" : "✔︎︎",

\ 'Ignored' : '☒',

\ "Unknown" : "?"

\ } " LeaderF,Ctrl+f 搜索文件

nnoremap :LeaderfFile ~

let g:Lf_WildIgnore = {

\ 'dir': ['.svn','.git','.hg','.vscode','.wine','.deepinwine','.oh-my-zsh'],

\ 'file': ['.sw?','~$','.bak','.exe','.o','.so','*.py[co]']

}

let g:Lf_UseCache = 0 " vim-smooth-scroll

noremap :call smooth_scroll#up(&scroll, 0, 2)

noremap :call smooth_scroll#down(&scroll, 0, 2)

noremap :call smooth_scroll#up(&scroll2, 0, 4)

noremap :call smooth_scroll#down(&scroll
2, 0, 4) " jedi-vim 配置,第一行是启用tab键补全,第二行是禁用 . 补全

" let g:SuperTabDefaultCompletionType = "context"

" let g:jedi#popup_on_dot = 0 "设置分割窗口

set splitbelow

set splitright

"设置窗口切换快捷键,例如,打开目录树的情况下,需要两个窗口来回切换

nnoremap

nnoremap

nnoremap

nnoremap " NERDTree 插件设置

"设置按F2启动/关闭NerdTree,开关树形目录的快捷键

map :NERDTreeToggle

" 在 vim 启动的时候默认开启 NERDTree

" autocmd vimenter * NERDTree

" 将 NERDTree 的窗口设置在 vim 窗口的右侧(默认为左侧)

" let NERDTreeWinPos="right"

" 当打开 NERDTree 窗口时,自动显示 Bookmarks

let NERDTreeShowBookmarks=1 " 显示行号

let NERDTreeShowLineNumbers=1

let NERDTreeAutoCenter=1 " 是否显示隐藏文件

let NERDTreeShowHidden=1 "隐藏目录树种的.pyc文件

let NERDTreeIgnore=['.pyc$', '~$'] "ignore files in NERDTree " 高亮显示目录树文件

let g:NERDTreeFileExtensionHighlightFullName = 1

let g:NERDTreeExactMatchHighlightFullName = 1

let g:NERDTreePatternMatchHighlightFullName = 1

let g:NERDTreeHighlightFolders = 1 " 更换目录的显示图标

let g:NERDTreeDirArrowExpandable='▷'

let g:NERDTreeDirArrowCollapsible='▼' " 自动设置python文件为pep8风格

au BufWrite *.py :Autoformat " 更换主题快捷键

nnoremap :PreviousColorScheme

inoremap :PreviousColorScheme

nnoremap :NextColorScheme

inoremap :NextColorScheme

nnoremap :RandomColorScheme

inoremap :RandomColorScheme

nnoremap :ShowColorScheme

inoremap :ShowColorScheme "开启代码折叠

set foldmethod=indent

set foldlevel=99

"设置快捷键为空格

noremap za

"显示折叠代码的文档字符串

let g:SimpylFold_docstring_preview=1 " vim字体设置

if has("gui_running")

set guifont=Droid\ Sans\ Mono\ Nerd\ Font\ Complete:h18 " 设置字体

set guioptions-=m " 隐藏菜单栏

set guioptions-=T " 隐藏工具栏

set guioptions-=L " 隐藏左侧滚动条

set guioptions-=r " 隐藏右侧滚动条

set guioptions-=b " 隐藏底部滚动条

set showtabline=0 " 隐藏Tab栏

set guicursor=n-v-c:ver5 " 设置光标为竖线

endif " 在显示目录树情况下直接退出,不用退出两次才回到命令行

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif " 命令行安装命令

" vim -c "PlugInstall" -c "q" -c "q"
</code></pre>
</details> 配置好之后,可以在命令行中直接安装,使用方法如下
```shell
vim -c "PlugInstall" -c "q" -c "q"

编辑器内部运行文件配置

.vimrc.run_file文件主要是可以让文件在vim编辑器里运行,从而避免每次运行都要退出vim,按F5运行文件

点击查看.vimrc.run_file文件详细内容

```shell
"一键运行代码
map :call CompileRunGcc()
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -o % %.html &"
exec "!firefox %.html &"
endif
endfunc
```

部分自定义快捷键

详细的相关快捷键在配置文件里面,可以根据个人爱好设置,快捷键的设置在 .vimrc.bundles 文件中,这里列出部分

F2 开启/关闭目录树

F9 下一个主题

F10 上一个主题

Ctrl+H 向左切换窗口

Ctrl+J 向下切换窗口

Ctrl+K 向上切换窗口

Ctrl+L 向右切换窗口

一键部署

以上配置是目前的vim自定义配置,由于环境不同,下载安装时间长,在新机器部署时发现效率特别低,所以把原始文件打包放GitHub上,做了个一键部署脚本,前提是Linux下存在git命令,能够克隆文件,一键部署只需要执行以下步骤

# jedi和pe8的支持插件
pip install jedi autopep8
# centos7下系统默认没有pip,需要安装epel源和pip
yum install epel-release -y
yum install python2-pip -y
# 自定义部署过程
git clone https://github.com/automationroad/vimIDE_config.git
sh vimIDE_config/latest_deploy_vimIDE.sh

一些实用技巧

1、在vim下复制文本内容时,由于vim自动缩进,造成复制的文本内容跟原来的不同格式,这时可以进入vim,然后设置:set paste 暂时取消自动缩进,复制内容时格式保持原样

2、待补充。。。

效果图

下图中, Last Changed 字段会根据vim修改文件的时间自动更新,特性和vim更新文件修改时间一样,退出时,按 q 或 q! 不更新时间,qw 一定会更新修改时间,x 当文件有修改时间更新修改时间

shell效果图



python效果图



补全效果图



目录树效果图



在Ubuntu下,目录树还会显示文件图标



目录树打开文件

vim使用文档

网上很多关于快捷键的图,本文底部附上一张快捷键图,另外以下两个方法是在Linux系统下学习练习的方法

1、vim快速入门文档,系统自带的简易教程,命令行输入 vimtutor(最简易的实践帮助文档,没有之一),文档是中文的

2、命令行输入 vim ,命令模式下输 :help ,这个是多窗口,输入 :help | only 设置只在一个窗口中显示

这里说明一下,系统自带的vim说明文档是英文的,设置为中文的方法

cd ~
wget http://sourceforge.net/projects/vimcdoc/files/vimcdoc/1.8.0/vimcdoc-1.8.0.tar.gz
tar --no-same-owner -zxf vimcdoc-1.8.0.tar.gz
[ ! -d ~/.vim ] && mkdir ~/.vim
mv vimcdoc-1.8.0 ~/.vim/doc
cd ~/.vim/doc
# 安装中文文档用 i 参数,卸载使用 u 参数
./vimcdoc.sh -i
# 到这一步已经可以打开vim查看中文帮助文档了,如果还是英文,则需要在配置文件修改,以下列出操作
[ ! -f ~/.vimrc ] && touch ~/.vimrc
echo 'set helplang=cn' >> ~/.vimrc
# vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:
# :set helplang=en 回车之后 :help 就是英文的help
# 同理,使用以下命令可重新使用中文文档
# :set helplang=cn 回车之后 :help 就是中文的help

快捷键图

打造个人的vimIDE的更多相关文章

  1. 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司

    一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...

  2. Android ViewPager打造3D画廊

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...

  3. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  4. 【转】 FineBI:自助式BI工具打造业务分析的“快与准”

    如今的企业经营方式,业务对于数据分析有极大的需求,但却苦于没有数据以及工具的有效支持,业务分析仍就依赖于IT报表制作.而IT方不断地按业务需求去调研.确认业务逻辑,然后取数做报表,其中还要忍受业务的需 ...

  5. 打造TypeScript的Visual Studio Code开发环境

    打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...

  6. 吐血大奉献,打造cnblogs最新最火辣的css3模板(IE9以下请勿入内) -- 第一版

    一直自己都想给自己的博客打造一个独一无二的皮肤,但是一直没有强劲的动力去完成这件事情.后来凭借着工作上面的需求(涉及到css3),就把自己的博客当成一个最好的试验场地.从而产生了你现在所看到的这个模板 ...

  7. [.Net] 手把手带你将自己打造的类库丢到 NuGet 上

    手把手带你将自己打造的类库丢到 NuGet 上 序 我们习惯了对项目右键点击“引用”,选择“管理NuGet 程序包”来下载第三方的类库,可曾想过有一天将自己的打造的类库放到 NuGet 上,让第三者下 ...

  8. 快速打造跨平台开发环境 vagrant + virtualbox + box

    工欲善其事必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑 刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电 ...

  9. 打造android偷懒神器———ListView的万能适配器

    如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...

随机推荐

  1. Python爬虫开发【第1篇】【Json与JsonPath】

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与 ...

  2. CentOS 6.4安装Ganglia

    samba 1.这里安装的是3.1.7版本,web前端是最新版本,安装前期环境(yum源用的是本地的) yum -y insatll php php-gd rrdtools apr-devel apr ...

  3. BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1935  Solved: 936[Submit][Stat ...

  4. frame pointer及其用途

    1 什么是frame pointer frame pointer指向本函数栈帧顶,通过它可以找到本函数在进程栈中的位置.有专门的寄存器保存该值. 2 frame pointer有什么用 主要是back ...

  5. USACO 刷题有感

    最近每天都尽量保持着每天一道USACO的题目,呵呵,一开始都是满简单的,一看题目基本上思路就哗啦啦地出来了,只不过代码实现有点麻烦,花了一些时间去调试,总体感觉还不错,但是越往后做,应该就很难保持一天 ...

  6. 【OI新闻】2016.10.26 - NOIP初赛泄题再次引爆

    有点劲,开车注意点,小心翻啦~ http://www.noi.cn/noi-news/noi/743-ccfnoip2016 CCF在NOIP2016初赛结束后接到举报:初赛前(22日12时左右),网 ...

  7. android判断正在使用的网络类型 0.不知道网络类型;1、2G;2、3G;3、4g;4、wifi

    判断正在使用的网络类型 0.不知道网络类型:1.2G:2.3G:3.4g:4.wifi /** Unknown network class. {@hide} */ public static fina ...

  8. missing required source folder

    Eclipse 中XXX is missing required source folder 问题的解决 https://blog.csdn.net/itzhangdaopin/article/det ...

  9. [Codeforces 1037E] Trip

    [题目链接] http://codeforces.com/problemset/problem/1037/E [算法] 首先离线 , 将问题倒过来考虑 , 转化为 : 每次删除一条边 , 此时最多有多 ...

  10. 迟到的WC2019打铁祭

    这是我最失败的一次考试... 具体过程就不说了,全程划水,掉线.还是自身实力不行啊. 最后文艺汇演,本人是DL24主唱&&rapper,欢迎大家交友.^_^.