Vim Configuration and Plug-in entry __vim

Source: Internet
Author: User
Tags autoload function definition function prototype parent directory rewind set background tagname word wrap


Vim's powerful in addition to shortcut keys, it is possible to configure or add plug-ins on their own, this article on the configuration and plug-in use of the introduction, the door after their own practice, recommended access to the documentation



The System Configuration folder for Vim itself is in the/usr/share/vim/and/etc/vim/two folders, where the configuration file affects all users. In general, we will not change the configuration file under these two folders, but modify the user's own profile ~/.VIMRC, will overwrite the global profile vim configuration Base configuration



"followed by a note


"The following are commented out as they cause vim-behave a lot" differently from regular Vi.
They are highly recommended though. Set Nu "Show line number" set ignorecase "search mode ignores case" set Smartcase "if the search pattern contains uppercase characters, the ' ignorecase ' option is not used.
Used only if you enter the search mode and open the ' ignorecase ' option. "Set Autowrite" automatically writes the content back to the file: If the file has been modified, at each ": Next,: Rewind,: Last,: A,:p revious,: Stop,: Suspend,: Tag,:!,: Make, Ctrl]
and the ctrl-^ command when the: buffer, Ctrl-o, Ctrl-i, ' {a-z0-9}, or ' {a-z0-9} ' command is transferred to another file. The set Autoindent setting is automatically aligned (indented): The indent value for each row is equal to the previous line, and the "noautoindent" set Smartindent smart alignment "set tabstop=4" setting tab Key) width "Set softtabstop=4" sets the width of the Soft tab "set shiftwidth=4" (automatic) Indent 4 space "set Cindent" using the automatic indent method for C/C + + language set Cinopti Ons={0,1s,t0,n-2,p2s, (03s,=.5s,>1s,=1s,:1s "set the specific indentation mode of the C + + language" set backspace=2 "setting the BACKSPACE key can set the match mode with" set Showmatch ", display match  The parentheses "set linebreak" whole word wrap "set whichwrap=b,s,<,>,[," the cursor can jump to another line from the beginning and end of the line to the "set hidden" Hide buffers when they are Abandoned "Set mouse=a" Enable mouse usage (all MOdes) Use the mouse "set number" Enable line numbers to display the row No. "set Previewwindow" Identity Preview window "set history=50" set command history to 5 0 History 50 "" "--state line setting--" set laststatus=2 "always shows the status line of the last window; When set to 1, displays the status line of the last window when the number of Windows is more than one; 0 does not display the status line for the last window" set ruler "" Ruler, which displays the line and column numbers for the cursor position, separated by commas. Each window has its own ruler. If the window has a status row, the ruler appears there.
Otherwise, it appears on the last line of the screen. "" "--command-line settings--the Set showcmd command line displays the command" set Showmode "command line to display the vim current mode" ""--find setting--"set Incsearch" input string shows match Point "Set Hlsearch
Topics and Presentations
Set Fileformats=unix,dos
set Background=dark "background color, many themes if the background color is different from the effect completely different
ColorScheme Desert" vim comes with the color scheme saved in/ The Usr/share/vim/vim72/colors directory
Plug-in DescriptionIt is recommended that you install pathogen to manage other plug-ins if your plug-in has its own Help document, you can load it in the following ways
Open vim, enter in command line mode: Helptags to load Plug-in's help group documents, or use: helptags help_dir load the Help group document of the specified directory, where Help_dir is the directory where you need to load the plugin help group documents, such as ~/.vim/bundle /nerdtree/doc the contents mentioned in the "Configuration" of each plug-in below, and copy directly into the ~/.VIMRC document Pathogen


Plugins for managing Plug-ins
Pathogen allows each plug-in to occupy a separate directory, resolving the problem of file fragmentation



Pathongen is mainly used to manage plug-ins, because each plug-in has its own set of directories including folders such as Auto,doc,color, if the corresponding files for each plug-in are placed in the corresponding directory each time, is a very tedious thing, and pathogen is the plug-in that appears to solve this problem.
Pathongen enabled, as long as the plug-in's independent directory structure of the entire copy to the bundle directory can be taken over by the Pathongen to run the new plug-in address



Https://github.com/tpope/vim-pathogen Installation



Copy the Pathongen.vim to the ~/.vim/autoload directory, that is, copy the extracted AutoLoad directory together with the Pathogen.vim plug-in inside to the ~/.vim/directory to enable



In the ~/.vimrc file, filetype plugin any place before indent on, add call Pathogen#infect ()
For example:


Execute pathogen#infect ()
syntax on
filetype plugin indent on
usage


If you want to add a new plug-in, just download the plugin, the entire directory copy to the ~/.vim/bundle/directory, that is, each plug-in in the Buddle directory each have a directory
The following plug-ins, such as no special instructions, are so applied to the configuration


Call Pathogen#infect ()
syntax enable
syntax on
filetype plugin indent on
other


Both pathogen and vundle are used to manage vim plug-ins, but their role is different.
Pathogen is designed to solve the problem that every plugin after installation files are dispersed to multiple directories and are poorly managed. Vundle is designed to address the ctags+tagbar+omnicppcomplete of automatic search and download plug-ins.



Generate tags + show + Lenovo Ctags



Ctags is not a vim plug-in, but a system tool, used to traverse the source code file, the establishment of the source Tree tag index (tag is defined as an identifier where, such as function definition), generate tags file, These tags files can be used by editors or other tools to quickly find the location of the source code symbols (Tag/symbol), such as variable name, function name. provided to Tagbar and Omnicppcomplete calls, view the function prototype installation after downloading the source code package from http://ctags.sourceforge.net/, unzip the source code directory and then go to the source code root directory for execution. Configure, then execute make and execute make install after the compilation succeeds. Add the following line to the ~/.VIMRC:
Map <C-F12>:!ctags-r--c++-kinds=+p--fields=+ias--extra=+q .<cr> Generate tags



In the directory where the source code is located, C and C + + files execute the following command separately
C:tags-r SRC
C++:ctags-r--c++-kinds=+p--fields=+ias--extra=+q src–c++-kinds=+p: Add a label for a function prototype to a C + + file –fields=+ias: Add inheritance information to the tag file (i), class Access control information for members (a), and the fingerprint of the function (S) –extra=+q: Adds a class modifier to the label. Note that if you do not have this option, you will not be able to complement the class member-R: recursively generate the tags file configuration file for all source files in SRC


Map <C-F12>:!ctags-r--c++-kinds=+p--fields=+ias--extra=+q .<cr>
set tags+=tags; "Set tags containing the directory"
set Tags+=./tags "in the current working directory search tags file   add present directory ' s generated tags file"
set Autochdir
usage


Move the cursor over an element, CTRL +] jumps to the corresponding definition


Ctrl+o can retreat back to where it was originally. If the current cursor is a local variable, GD jumps to the definition of this local variable. 
shortcut keys:
CTRL +]  jump to the label of the word under the current cursor
ctrl+o  returns the previous label
ctrl+t  returns the previous label
: Tag TagName jumps to TagName tag
The above command displays the label in the current window, the file in the current window replaces the package label file, and the current window cursor jumps to the label position. If you do not want to display a label in the current window, you can use the following command:
: Stag TagName New Window display TagName label, cursor jump to the label
Ctrl+w +]  New window displays the label of the word under the current cursor, the cursor jumps to the label
when a label has more than one match (the function (or method in the class) is defined multiple times), the ": Tags"
command jumps to the first place. If there is a match in the current file, it will be used first.
You can use these commands to move between matching tags:
: TFirst    to first match:
[count]tprevious forward [count] match
: [Count]tnext  Back [count] match
: Tlast    to the last match
or select which to jump to by using the following command
: Tselect TagName
Enter the above command, VIM will show you a list of choices. You can then enter the matching code to jump to
(in the first column). Other column information lets you know where the label is defined. The
following command displays the label in the preview window:p the tag
TagName Preview window displays the TagName label, the cursor jumps to the label
Ctrl+w +}  Preview window displays the label of the word under the current cursor, and the cursor jumps to the label
:p   Close closes the preview window
:p Edit file.h Editing the file file.h in the preview window (useful when editing the header file)
:p search Atoi
Finding the current file and any words in the containing file and displaying the match in the preview window is useful when you are using a library function that does not have a label file.
other


Cscope is a tool similar to ctags, but its function is much more powerful than ctags Tagbar plug-ins



Tagbar is a taglist alternative, more suitable for C + + use than taglist, functions can be divided by class, support by class folding display, display results clear concise address



Https://github.com/majutsushi/tagbar Configuration


Nmap <F4>:tagbartoggle<cr>   "Set the shortcut key F4" let
g:tagbar_width =       "Set the width, the default is"
" Autocmd Vimenter * Nested:call tagbar#autoopen (1)    "Open vim automatically open Tagbar
" let G:tagbar_left = 1         "On the left
Let G:tagbar_right = 1        "On the right  
Omnicppcomplete


For C + + syntax-complement plug-ins, you can function, namespace, class members, etc. to complete the completion
To implement an address based on Ctags generated index information



http://www.vim.org/scripts/script.php?script_id=1520 Usage



E.g: Enter the PRI, then press "Ctrl+x Ctrl+o", at which time VI will pop up a window, all the beginning of the PRI tag will appear in this window
When the auto-fill drop-down window pops up, some of the available shortcuts:


Ctrl+p  forward Toggle member
CTRL + N  Toggle member Ctrl+e to exit the Drop-down
window and  return to the original input text
ctrl+y to exit the Drop-down  window and accept the current option
Other complementary methods:
Ctrl+x ctrl+l full line complement
Ctrl+x CTRL + N to complete the  keyword in the current file
ctrl+x ctrl+k  to complete  the dictionary ctrl+x ctrl+t Complement full ctrl+x ctrl+i according to the thesaurus
ctrl+x Ctrl +]  according to the label complement
ctrl+x ctrl+f full  file name
Ctrl+x ctrl+d  complement macro definition
Ctrl+x Ctrl + V full  vim command
ctrl+x ctrl+u  user-defined complement method
ctrl+x Ctrl+s  Spelling Suggestions
help documents
: Helping Omnicppcomplete
Configuration
Set Completeopt=longest,menu "let
omnicpp_namespacesearch = 2     " Search namespaces in the current buffer and   I n Included files let
omnicpp_defaultnamespaces = ["Std", "_GLIBCXX_STD"] let
omnicpp_namespacesearch = 1
Let Omnicpp_globalscopesearch = 1 let
omnicpp_showaccess = 1 let
omnicpp_showprototypeinabbr = 1 "display function argument list
l ET Omnicpp_maycompletedot = 1   "input.  " After automatic fill let
omnicpp_maycompletearrow = 1 "input-> automatic fill let
omnicpp_maycompletescope = 1" input:: After automatic fill let
omnicpp_defaultnamespaces = [STD, _glibcxx_std]
"Automatically close the complement window
" au cursormovedi,insertleave * if pumvisible ( ) = = 0|silent! Pclose|endif
"Set completeopt=menuone,menu,longest
" Landscaping
highlight Pmenu    Guibg=darkgrey  Guifg=black 
Highlight Pmenusel guibg=lightgrey guifg=black
"Pmenu is the color of all items, Pmenusel is the color of the selected item, GUIBG and GUIFG Corresponds to the background color and foreground color respectively.
to the STL full complement installationDownload STL source code copy to specified folder
CP ~/.vim/tags/cpp_src Execute CTAG command
Ctags-r--sort=yes--c++-kinds=+p--fields=+ias--extra=+q--language-force=c++ Add the following settings in ~/.VIMRC
Set Tags+=~/.vim/tags/cpp_src/tags Nerdtree


File Tree Browsing address



Https://github.com/scrooloose/nerdtree Configuration


Map <C-n>:nerdtree<cr> "CTRL + N shortcut keys open

" Vim-cpp-enhanced-highlight C + + highlighting
"highlighting of class The scope is disabled by default. To enable the set let
g:cpp_class_scope_highlight =0 

"Taghighlight the vim plug-ins such as the highlight typedef type enum macros Taghighlight 
" Open source file, then
": Updatetypesfile


" h\c switch A.vim (for C, C + +)
"copy A.vim to D:\Program Files\vim\vim73\plugin, _ VIMRC add: 
nnoremap <silent> <F12>:a<cr> "Press F12 to switch between c/h files, or through input: A 

" highlighting of Template functions is enabled by setting let
g:cpp_experimental_template_highlight = 1
usage


CTRL + N open and Jump window, by placing the cursor on a directory/file, through a button to operate, listed below a few common buttons and their corresponding operations. More operations can be done by typing ". "View the Help document


File-related Actions
o  : Open the file in the previous window where the cursor is located and place the cursor in the newly opened window go
: Preview file with cursor resting in nerdtree window
T  : Open File in new tab and activate
GT: Open file in new tab, cursor left in nerdtree window
i  : Horizontal split Open file
GI: Horizontal split preview
s  : Vertical split Open File
GS: Vertical split preview

directory tree related operations
o  : Expand/Close Directory
o  : recursively expand directory. Use caution, if there are more directory levels, it will be slow to open
x  : Close parent directory
C  : Toggle cursor directory to root
u  : Toggle directory tree root directory for upper directory
u  : Toggles the root of the directory tree to the upper directory and keeps the state of the old directory tree
R  : Refreshes the current directory
R  : Refreshes the current root directory (which is used after the new file is added)
CD: Switch the VIM working directory to the directory where the cursor is located (Command mode: PWD can view the current working directory)
Youcompleteme


Youcompleteme is a comparison of new vim code complement Plug-ins, can be based on clang for C/s + + code to provide code hints



YCM need vim version at least 7.3.584, can use: Version view vim version number
There is also a need to support python: The result of Echo has (' Python ') is 1. Address



Https://github.com/Valloric/YouCompleteMe Installation



YCM installation is relatively complex, first with the download plug-in, with pathogen (or vundle) for the corresponding installation and then download clang, placed under the Ycm_temp/llvm_root_dir:


$ mkdir-p ~/ycm_temp/llvm_root_dir
 $ mv ~/download/clang+llvm/* ~/ycm_temp/llvm_root_dir
 $ cd ycm_temp/llvm_ Root_dir 
 $ llvm_root_dir  ls
 bin  docs  include  Lib  share
Install CMake and Python-dev, and then compile the following:
$ cd ~
 $ mkdir ycm_build
 $ cd ycm_build
 $ cmake-g "Unix makefiles"-dpath_to_llvm_root=~/ycm_temp/llvm_roo T_dir.
 ~/.vim/bundle/youcompleteme/cpp
 $ ycm_core
xptemplate


More powerful code fragment complement usage than snipmate



"To see the code snippets supported by the current file type, you can type Ctr+r ctr+r in insert mode ctr+\
Insert mode, enter the name of the fragment, then ctr+\ to insert the code, and then change the highlighted content with the TAB key and Shift tab.
" Supertab



Omnicppcomplete trigger complement need to use CTR+X ctr+o,supertab support TAB key complement



Because the TAB key is mapped to a complementary shortcut, you can not directly enter tabs through the TAB key, then if you want to enter tab can pass Ctr+v tab, that is, input ctr+v and then enter the TAB key, in Vim, through the ctl+v can enter a lot of invisible characters, such as a try Ctr+ V ctr+w Address



Https://github.com/ervandew/supertab Disable Plugins



There are two ways to manage plug-ins through the pathogen:
The first, added in ~/.VIMRC, is primarily to be placed before execute Pathogen#infect ()


Let g:pathogen_disabled = [' vim-cpp-enhanced-highlight ']
' if the version is less than 7.0, disable Yourcompliteme ' if
v:version < ' 703584 ' Call  
  Add (g:pathogen_disabled, ' youcompleteme ') 
endif
execute Pathogen#infect ()


Second, modify the name of the plugin directory in the. Vim/bundle, such as to disable plug-in vim-cpp-enhanced-highlight, you can use the following command


$ mv Vim-cpp-enhanced-highlight vim-cpp-enhanced-highlight~
Full VIMRC file
"Vim's own system configuration folder is in the /usr/share/vim/ and /etc/vim/ folders. The configuration file here affects all users. In general, we will not change these two files. Clip the configuration file, but modify the user's own configuration file ~/.vimrc, which will overwrite the global configuration file.
"
Set nu
"pathogen management plugin plugin
"pathogen allows each plugin to occupy a separate directory, which solves the problem of file fragmentation.
"Installation: Copy pathongen.vim to the ~/.vim/autoload directory, that is, copy the unzipped autoload directory along with the pathogen.vim plugin to the ~/.vim/ directory.
"Enable: In the ~/.vimrc file, anywhere before the filetype plugin indent on, join the Greek all pathogen#infect()
"Install new plugin: After downloading the plugin, copy the entire directory to the ~/.vim/bundle/ directory, that is, each plugin has a directory in the buddle directory.
"Disable plugin To disable a plugin, add it's bundle name to the following list
"let g:pathogen_disabled = ['vim-cpp-enhanced-highlight']
"The above way to be confirmed, you can also use
"mv vim-cpp-enhanced-highlight vim-cpp-enhanced-highlight~
"Implementation disabled
Call pathogen#infect()

Syntax enable " syntax highlighting"
Syntax on
"detect file type
"Adaptive intelligent indentation in different languages
Filetype indent on

Filetype plugin indent on

"The following are commented out as they cause vim to behave a lot
" " differently from regular Vi. They are highly recommended though.
"
Set ignorecase " ignores case in search mode
Set smartcase " If the search mode contains uppercase characters, don't use 'ignorecase'
"Options. Only used when entering search mode and opening the 'ignorecase' option.
"set autowrite" automatically writes the content back to the file: if the file has been modified, at each
" :next, :rewind, :last, :first, :previous, :stop, :suspend, :tag, :!, :make, CTRL-]
" and CTRL-^ command; use :buffer, CTRL-O, CTRL-I, '{A-Z0-9} or `{A-Z0-9}
"The same is true when the command is transferred to another file.
" set autoindent " sets automatic alignment (indentation): that is, the indentation value of each line is equal to the previous line;
" noautoindent cancels the setting
" "set smartindent" smart alignment
" set tabstop=4 " set the width of the tab (tab)
" set softtabstop=4 " sets the width of the soft tab
" set shiftwidth=4 " (automatic) 4 spaces used for indenting
" set cindent " uses the automatic indentation of the C/C++ language
" set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
" "Setting the specific indentation of C / C + + language
" set backspace=2 " set backspace key available
" set showmatch " sets the matching pattern to show matching parentheses
" set linebreak " whole word wrap
" set whichwrap=b,s,<,>,[,] " The cursor can jump to another line from the beginning of the line and the end of the line.
" set hidden " Hide buffers when they are abandoned
" set mouse=a " Enable mouse usage (all modes) "Use mouse
" set number " Enable line number " Display line number
"set previewwindow" identifies the preview window
" set history=50 " set command history to 50 " history 50
"
"
" "--Status line setting --
" set laststatus=2 "
" Always display the status line of the last window; set to 1 to display the status line of the last window when there are more than one window; 0 does not display the status line of the last window
" set ruler "
The ruler is used to display the line and column numbers of the cursor position, separated by commas. Each window has its own ruler. If the window has a status line, the ruler is displayed there. Otherwise, it is displayed on the last line of the screen.
"
" "--Command line settings --
The "set showcmd" command line displays the entered commands
The "set showmode" command line displays the current mode of vim
"
" "--find setting--
" set incsearch " input string shows matching points
" set hlsearch




"pathogen and vundle are used to manage the vim plugin, but the role is different.
"pathogen exists to solve the problem that each plug-in is distributed after it is distributed to multiple directories. The vundle exists to solve the problem of automatic search and download of plug-ins.

"scheme
Set fileformats=unix,dos
"let g:solarized_termtrans = 1
Set background=dark
Colorcheme desert "vim's own color scheme is stored in the /usr/share/vim/vim72/colors directory
"togglebg#map("<F5>")

"ctags+tagbar+omnicppcomplete generate tags + display
"The first step to generate tags
"Generate tags, view function prototypes
"c :ctags -R src
"c++:ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
" --c++-kinds=+p : Add a function prototype tag to a C++ file
" --fields=+iaS : Add inheritance information (i) to the tag file, access control information for class members (a), and fingerprint for function (S)
" --extra=+q : Add a class modifier to the tag. Note that without this option, you will not be able to complete class members.
" -R : recursively generate tags files for all source files in src
"tag command usage: using the tags file is also very simple, move the cursor to an element, CTRL+] will jump to the corresponding definition,
"CTRL+o can be rolled back to the original place. If the current cursor is a local variable, gd jumps to the definition of this local variable.
"hot key:
"Ctrl+] jumps to the label of the word under the current cursor
"Ctrl+O returns to the previous tab
"Ctrl+T returns to the previous tab
":tag TagName jumps to the TagName tag
"The above command displays the label in the current window. The file in the current window is replaced with the file of the package label. The current window cursor jumps to the label position. If you do not want to display the label in the current window, you can use the following command:
":stag TagName new window shows TagName tag, cursor jumps to tag
"Ctrl+W + ] The new window displays the label of the word under the current cursor, and the cursor jumps to the label.
"When a tag has multiple matches (the function (or method in the class) is defined multiple times), ":tags"
"The command will jump to the first place. If there is a match in the current file, it will be used first.
"You can use these commands to move between matching tags:
":tfirst to the first match
":[count]tprevious forward [count] matches
":[count]tnext backwards [count] matches
":tlast to the last match
"Or use the following command to choose which one to jump to
":tselect TagName
"After entering the above command, vim will show you a selection list. Then you can enter the matching code to jump to.
"(in the first column). The information in the other columns lets you know where the tag was defined.
"The following command will display the label in the preview window
":ptag TagName preview window shows TagName tag, cursor jumps to tag
"Ctrl+W + } The preview window displays the label of the word under the current cursor, and the cursor jumps to the label.
":pclose closes the preview window
":pedit file.h Edit file file.h in the preview window (useful when editing header files)
":psearch atoi
"Finding the current file and any words in the include file and displaying the match in the preview window is useful when working with library functions without a tag file.
"
"
""Cscope is a tool similar to ctags, but its functionality is much more powerful than ctags.

Map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
Set tags+=tags; "Set the directory containing the tags
Set tags+=./tags "Search for tags files in the current working directory add current directory's generated tags file
"set autochdir

"Step 2, tagbar plugin
"tagbar is a taglist alternative, more suitable for c++ than taglist, functions can be distinguished by class, support for folding by class, etc., display clear and concise
"tagbar
"https://github.com/majutsushi/tagbar
Nmap <F4> :TagbarToggle<CR> "Setting shortcuts
Let g:tagbar_width = 40 "Set the width, the default is 40
"autocmd VimEnter * nested :call tagbar#autoopen(1) "Automatically open tagbar when opening vim
"let g:tagbar_left = 1 " on the left
Let g:tagbar_right = 1 "on the right

"
"The third step omnicppcomplete
"Based on the ctags database that is the tags file (based on the index information generated by ctags to achieve automatic completion)
"A plugin for grammar completion of C++ can complement functions, namespaces, class members, etc., and is similar to most IDEs. The difference is that the IDE does a lot of things you don't know for you. Omni completion needs to rely on the tags file, you need to use ctags command to generate your own
"e.g: Enter pri, then press "Ctrl+X Ctrl+O", vi will pop up a window, all tags starting with pri will appear in this window
"When the auto-completion drop-down window pops up, some of the available shortcuts:
"Ctrl+P to switch members forward
"Ctrl+N to switch members backwards
"Ctrl+E means to exit the drop-down window and return to the originally entered text.
"Ctrl+Y means to exit the drop-down window and accept the current option
"Other completion methods:
"Ctrl+X Ctrl+L full line completion
"Ctrl+X Ctrl+N based on keyword completion in the current file
"Ctrl+X Ctrl+K Completion based on dictionary
"Ctrl+X Ctrl+T Completion based on the synonym dictionary
"Ctrl+X Ctrl+I is based on keyword completion in the header file
"Ctrl+X Ctrl+]

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.