دليل احترافي لإعداد ملف Vimrc وتخصيص محرر Vim بالمختصرات وVimscript وشريط الحالة

دقائق القراءة: 10

مقدمة: لماذا يستحق ملف .vimrc وقتك؟

يُعدّ ملف .vimrc حجر الأساس في تخصيص محرر Vim. فمن خلاله يمكنك تحويل المحرر من بيئة نصية بسيطة إلى مساحة عمل سريعة ومرنة ومناسبة تماماً لأسلوبك في البرمجة والتحرير. وكلما كان إعداد هذا الملف منظماً ومدروساً، ازدادت إنتاجيتك وسهُل عليك التنقل والبحث والتنفيذ داخل المشروع.

في هذا الدليل سنعيد بناء تجربة استخدام Vim خطوة بخطوة، بدءاً من الإعدادات الأساسية، مروراً بتنظيم الملف، ثم إضافة الإضافات، وكتابة الاختصارات، واستخدام Vimscript، وصولاً إلى تخصيص شريط الحالة.

دليل إعداد وتخصيص ملف vimrc في محرر Vim للمبرمجين

إنشاء البنية الأساسية لملفات Vim

قبل البدء في التخصيص، من الأفضل تجهيز المجلدات التي سيعتمد عليها Vim لتخزين الإضافات والألوان والنسخ الاحتياطية. هذا التنظيم المبكر يسهل عليك إدارة بيئتك لاحقاً.

.vim/
├── autoload/
├── backup/
├── colors/
└── plugged/

ولإنشاء هذه البنية على أنظمة Linux أو macOS استخدم:

$ mkdir -p ~/.vim ~/.vim/autoload ~/.vim/backup ~/.vim/colors ~/.vim/plugged

بعد ذلك أنشئ ملف .vimrc داخل المجلد الرئيسي للمستخدم:

$ touch ~/.vimrc

الإعدادات الأساسية في Vim لتحسين تجربة التحرير

الخطوة الأولى لأي ملف .vimrc فعّال هي ضبط الإعدادات التي تؤثر مباشرة في طريقة الكتابة والبحث والتنقل داخل الملفات.

تفعيل اكتشاف أنواع الملفات والإضافات

" Disable compatibility with vi which can cause unexpected issues.
set nocompatible

" Enable type file detection.
filetype on

" Enable plugins and load plugin for the detected file type.
filetype plugin on

" Load an indent file for the detected file type.
filetype indent on

هذا الجزء يعطّل التوافق القديم مع vi ويمنح Vim سلوكاً حديثاً أفضل، مع تفعيل اكتشاف نوع الملف وتحميل إعدادات الإزاحة الخاصة به.

تفعيل تلوين الصياغة البرمجية

" Turn syntax highlighting on.
syntax on

تمييز الصياغة يجعل قراءة الشيفرة أسرع ويقلّل أخطاء التتبّع البصري، خصوصاً في الملفات الطويلة أو عند التعامل مع أكثر من لغة برمجة.

محرر Vim قبل تفعيل تلوين الصياغة البرمجيةمحرر Vim بعد تفعيل تلوين الصياغة البرمجية

إظهار أرقام الأسطر وموقع المؤشر

" Add numbers to each line on the left-hand side.
set number

إظهار أرقام الأسطر في محرر Vim

" Highlight cursor line underneath the cursor horizontally.
set cursorline

" Highlight cursor line underneath the cursor vertically.
set cursorcolumn

يساعدك هذان الخياران على تحديد موضع المؤشر بدقة، خاصة عند مراجعة ملفات كبيرة أو جداول نصية طويلة.

تمييز السطر والعمود الحاليين في Vim

أهم الإعدادات اليومية داخل ملف .vimrc

" Set shift width to 4 spaces.
set shiftwidth=4

" Set tab width to 4 columns.
set tabstop=4

" Use space characters instead of tabs.
set expandtab

" Do not save backup files.
set nobackup

" Do not let cursor scroll below or above N number of lines when scrolling.
set scrolloff=10

" Do not wrap lines.
set nowrap

" While searching though a file incrementally highlight matching characters as you type.
set incsearch

" Ignore capital letters during search.
set ignorecase

" Override the ignorecase option if searching for capital letters.
set smartcase

" Show partial command you type in the last line of the screen.
set showcmd

" Show the mode you are on the last line.
set showmode

" Show matching words during a search.
set showmatch

" Use highlighting when doing a search.
set hlsearch

" Set the commands to save in history default number is 20.
set history=1000

هذه الإعدادات تمنحك سلوكاً عملياً في الكتابة والبحث، وتساعد على توحيد التنسيق داخل الملفات، خصوصاً إذا كنت تعمل ضمن فريق تطوير.

تفعيل الإكمال التلقائي بأسلوب مشابه لـ Bash

" Enable auto completion menu after pressing TAB.
set wildmenu

" Make wildmenu behave like similar to Bash completion.
set wildmode=list:longest

" Ignore files with these extensions.
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx

ميزة wildmenu مفيدة عند فتح الملفات أو التنقل بينها بسرعة، كما أن خيار wildignore يبعد عنك الملفات غير المناسبة للتحرير داخل Vim.

ميزة wildmenu في محرر Vim للإكمال التلقائي والتنقل بين الملفات

للحصول على شرح أي أمر، يمكنك استخدام الصيغة التالية:

:help nocompatible

تنظيم ملف .vimrc باستخدام الطي Folding

كلما زادت إعداداتك، أصبح ملف .vimrc أطول وأكثر تعقيداً. لذلك فإن تقسيمه إلى أقسام قابلة للطي يمنحك رؤية أوضح وسهولة أكبر في الصيانة.

" PLUGINS ---------------------------------------------------------------- {{{
" Plugin code goes here.
" }}}

" MAPPINGS --------------------------------------------------------------- {{{
" Mappings code goes here.
" }}}

" VIMSCRIPT -------------------------------------------------------------- {{{
" This will enable code folding.
augroup filetype_vim
  autocmd!
  autocmd FileType vim setlocal foldmethod=marker
augroup END
" More Vimscripts code goes here.
" }}}

" STATUS LINE ------------------------------------------------------------ {{{
" Status bar code goes here.
" }}}

بعد الحفظ باستخدام :w، أعد تحميل الملف بالأمر :source ~/.vimrc لتطبيق التغييرات مباشرة دون إغلاق المحرر.

ومن أوامر الطي المفيدة:

  • zo: فتح الجزء المطوي تحت المؤشر.
  • zc: إغلاق الجزء المطوي تحت المؤشر.
  • zR: فتح جميع الأجزاء المطوية.
  • zM: إغلاق جميع الأجزاء المطوية.

فتح وإغلاق الأقسام المطوية في ملف vimrc داخل Vim

ولمزيد من التفاصيل استخدم :help folding.

إضافة الإضافات إلى Vim عبر مدير الإضافات vim-plug

الإضافات توسّع قدرات Vim بشكل كبير، سواء في استعراض الملفات أو فحص الأخطاء أو تحسين تجربة التطوير اليومية. ولتسهيل إدارة هذه الإضافات، يفضّل استخدام مدير مخصص مثل vim-plug.

تثبيت vim-plug

على Linux أو macOS:

$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

على Windows باستخدام Powershell:

$ iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
  ni $HOME/vimfiles/autoload/plug.vim -Force

إضافة قسم الإضافات داخل .vimrc

" PLUGINS ---------------------------------------------------------------- {{{
call plug#begin('~/.vim/plugged')
call plug#end()
" }}}

أي إضافة جديدة تضعها بين call plug#begin() وcall plug#end().

أمثلة عملية على تثبيت إضافات شائعة

" PLUGINS ---------------------------------------------------------------- {{{
call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
Plug 'preservim/nerdtree'
call plug#end()
" }}}

في هذا المثال:

  • ALE تساعد في فحص الشيفرة وإظهار التنبيهات.
  • NERDTree تضيف متصفح ملفات عملياً داخل المحرر.

بعد حفظ الملف وإعادة تحميله بواسطة :source ~/.vimrc، شغّل الأمر التالي لتنزيل الإضافات وتثبيتها:

:PlugInstall

تثبيت إضافات Vim باستخدام vim-plug

تخصيص اختصارات لوحة المفاتيح في Vim

الاختصارات أو Mappings من أهم عناصر التخصيص في Vim، لأنها تقلل عدد الضغطات وتختصر الأوامر المتكررة إلى حركات بسيطة وسريعة.

صيغة كتابة الاختصارات

map_mode <what_you_type> <what_is_executed>

أشهر أوضاع التعيين

  • nnoremap: لتعيين اختصارات في الوضع العادي.
  • inoremap: لتعيين اختصارات في وضع الإدراج.
  • vnoremap: لتعيين اختصارات في الوضع المرئي.

ومن الأمثلة الشائعة تحويل jj إلى مفتاح Esc للخروج السريع من وضع الإدراج:

inoremap jj <Esc>

استخدام المفتاح القائد <leader>

يسمح لك mapleader باختيار مفتاح أساسي غير مستغل في Vim لربط اختصاراتك الخاصة. المفتاح الافتراضي غالباً هو الشرطة العكسية، لكن كثيراً من المستخدمين يغيّرونه إلى الفاصلة أو أي مفتاح مريح.

let mapleader = "\"

مثال على استخدامه لإلغاء تمييز نتائج البحث:

nnoremap <leader>\ :nohlsearch<CR>

مجموعة اختصارات عملية جاهزة

" MAPPINGS --------------------------------------------------------------- {{{
" Set the backslash as the leader key.
let mapleader = "\"

" Press \\ to jump back to the last cursor position.
nnoremap <leader>\ ``

" Press \p to print the current file.
nnoremap <silent> <leader>p :%w !lp<CR>

" Type jj to exit insert mode quickly.
inoremap jj <Esc>

" Press the space bar to type the : character in command mode.
nnoremap <space> :

" Open a new line below or above, then exit insert mode.
nnoremap o o<esc>
nnoremap O O<esc>

" Center the cursor when moving between search results.
nnoremap n nzz
nnoremap N Nzz

" Yank from cursor to end of line.
nnoremap Y y$

" Run current Python file with F5.
nnoremap <f5> :w <CR>:!clear <CR>:!python3 % <CR>

" Easier split navigation.
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l

" Resize split windows.
noremap <c-up> <c-w>+
noremap <c-down> <c-w>-
noremap <c-left> <c-w>>
noremap <c-right> <c-w><

" NERDTree toggle.
nnoremap <F3> :NERDTreeToggle<cr>

" Ignore files in NERDTree.
let NERDTreeIgnore=['\.git$', '\.jpg$', '\.mp4$', '\.ogg$', '\.iso$', '\.pdf$', '\.pyc$', '\.odt$', '\.png$', '\.gif$', '\.db$']
" }}}

هذه الأمثلة لا تمثل قواعد ثابتة، بل نقطة انطلاق جيدة. الأفضل دائماً أن تبني اختصارات تناسب عاداتك الفعلية أثناء العمل.

وللتوسع يمكنك استخدام :help map-modes.

إضافة أوامر ذكية باستخدام Vimscript

لغة Vimscript تتيح لك بناء منطق مخصص داخل المحرر، مثل تشغيل أوامر تلقائية عند فتح نوع معين من الملفات أو عند تبديل النوافذ أو عند تشغيل النسخة الرسومية من Vim.

" VIMSCRIPT -------------------------------------------------------------- {{{
" Enable the marker method of folding.
augroup filetype_vim
  autocmd!
  autocmd FileType vim setlocal foldmethod=marker
augroup END

" If the current file type is HTML, set indentation to 2 spaces.
autocmd Filetype html setlocal tabstop=2 shiftwidth=2 expandtab

" If Vim version is equal to or greater than 7.3 enable undofile.
if version >= 703
  set undodir=~/.vim/backup
  set undofile
  set undoreload=10000
endif

" Display cursorline and cursorcolumn only in active window.
augroup cursor_off
  autocmd!
  autocmd WinLeave * set nocursorline nocursorcolumn
  autocmd WinEnter * set cursorline cursorcolumn
augroup END

" GUI-specific settings.
if has('gui_running')
  set background=dark
  colorscheme molokai
  set guifont=Monospace\ Regular\ 12
  set guioptions-=T
  set guioptions-=L
  set guioptions-=r
  set guioptions-=m
  set guioptions-=b
  nnoremap <F4> :if &guioptions=~#'mTr'<Bar> \set guioptions-=mTr<Bar> \else<Bar> \set guioptions+=mTr<Bar> \endif<CR>
endif
" }}}

ماذا يضيف هذا الجزء عملياً؟

  • تفعيل الطي تلقائياً عند تعديل ملفات vim.
  • ضبط الإزاحة إلى مسافتين عند تحرير ملفات HTML.
  • تفعيل undofile للاحتفاظ بسجل التراجع حتى بعد حفظ الملف وإغلاقه.
  • إظهار تمييز السطر والعمود في النافذة النشطة فقط لتقليل التشويش البصري.
  • تخصيص النسخة الرسومية من Vim من حيث الألوان والخط وعناصر الواجهة.

للتعمق في هذا الجانب، يفيدك الرجوع إلى :help autocmd وقراءة مراجع متخصصة في Vimscript.

إضافة قوالب ألوان Color Schemes إلى Vim

اختيار ألوان مناسبة لا يغيّر الشكل فقط، بل يؤثر في الراحة البصرية وسرعة قراءة الشيفرة. لذلك يعتمد كثير من المطورين على قوالب ألوان مخصصة بدلاً من الإعداد الافتراضي.

يمكنك تثبيت أي قالب ألوان بوضع ملف .vim الخاص به داخل المسار ~/.vim/colors/. المثال التالي يثبت قالب molokai الشهير:

$ cd ~/.vim/colors
$ curl -o molokai.vim https://raw.githubusercontent.com/tomasr/molokai/master/colors/molokai.vim

ولتفعيل القالب داخل المحرر:

:colorscheme molokai

أمثلة على قوالب ألوان مختلفة في محرر Vim

من المفيد تجربة أكثر من قالب حتى تصل إلى التوازن المناسب بين التباين والوضوح وراحة العين.

تخصيص شريط الحالة Status Line في Vim

شريط الحالة ليس مجرد عنصر شكلي، بل مساحة تعرض لك بيانات مهمة أثناء التحرير، مثل مسار الملف ونوعه وموقع المؤشر ونسبة التقدم داخل المستند.

" STATUS LINE ------------------------------------------------------------ {{{
" Clear status line when vimrc is reloaded.
set statusline=

" Status line left side.
set statusline+=\ %F\ %M\ %Y\ %R

" Use a divider to separate the left side from the right side.
set statusline+=%=

" Status line right side.
set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%

" Show the status on the second to last line.
set laststatus=2
" }}}

شرح أهم الرموز المستخدمة

  • %F: يعرض المسار الكامل للملف الحالي.
  • %M: يوضح ما إذا كان الملف قد عُدّل ولم يُحفظ بعد.
  • %Y: يعرض نوع الملف الحالي.
  • %R: يشير إلى أن الملف للقراءة فقط إن وُجد.
  • %b: يعرض قيمة المحرف الحالي بصيغة ASCII أو Unicode.
  • 0x%B: يعرض القيمة الست عشرية للمحرف.
  • %l: رقم السطر الحالي.
  • %c: رقم العمود الحالي.
  • %p%%: نسبة موضع المؤشر من أعلى الملف.

شريط الحالة المخصص في محرر Vim

إذا رغبت في توسيع هذا الجزء أكثر، راجع :help statusline.

ملف .vimrc كامل كنقطة بداية عملية

إذا كنت تريد نسخة أولية متكاملة يمكنك البناء عليها، فإليك نموذجاً كاملاً يجمع معظم العناصر السابقة:

" Disable compatibility with vi which can cause unexpected issues.
set nocompatible
filetype on
filetype plugin on
filetype indent on
syntax on
set number
set cursorline
set cursorcolumn
set shiftwidth=4
set tabstop=4
set expandtab
set nobackup
set scrolloff=10
set nowrap
set incsearch
set ignorecase
set smartcase
set showcmd
set showmode
set showmatch
set hlsearch
set history=1000
set wildmenu
set wildmode=list:longest
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx

" PLUGINS ---------------------------------------------------------------- {{{
call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
Plug 'preservim/nerdtree'
call plug#end()
" }}}

" MAPPINGS --------------------------------------------------------------- {{{
let mapleader = "\"
nnoremap <leader>\ ``
nnoremap <silent> <leader>p :%w !lp<CR>
inoremap jj <Esc>
nnoremap <space> :
nnoremap o o<esc>
nnoremap O O<esc>
nnoremap n nzz
nnoremap N Nzz
nnnoremap Y y$
nnoremap <f5> :w <CR>:!clear <CR>:!python3 % <CR>
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
noremap <c-up> <c-w>+
noremap <c-down> <c-w>-
noremap <c-left> <c-w>>
noremap <c-right> <c-w><
nnoremap <F3> :NERDTreeToggle<cr>
let NERDTreeIgnore=['\.git$', '\.jpg$', '\.mp4$', '\.ogg$', '\.iso$', '\.pdf$', '\.pyc$', '\.odt$', '\.png$', '\.gif$', '\.db$']
" }}}

" VIMSCRIPT -------------------------------------------------------------- {{{
augroup filetype_vim
  autocmd!
  autocmd FileType vim setlocal foldmethod=marker
augroup END

autocmd Filetype html setlocal tabstop=2 shiftwidth=2 expandtab

if version >= 703
  set undodir=~/.vim/backup
  set undofile
  set undoreload=10000
endif

augroup cursor_off
  autocmd!
  autocmd WinLeave * set nocursorline nocursorcolumn
  autocmd WinEnter * set cursorline cursorcolumn
augroup END

if has('gui_running')
  set background=dark
  colorscheme molokai
  set guifont=Monospace\ Regular\ 12
  set guioptions-=T
  set guioptions-=L
  set guioptions-=r
  set guioptions-=m
  set guioptions-=b
  nnoremap <F4> :if &guioptions=~#'mTr'<Bar> \set guioptions-=mTr<Bar> \else<Bar> \set guioptions+=mTr<Bar> \endif<CR>
endif
" }}}

" STATUS LINE ------------------------------------------------------------ {{{
set statusline=
set statusline+=\ %F\ %M\ %Y\ %R
set statusline+=%=
set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%
set laststatus=2
" }}}

نصائح عملية لجعل ملف .vimrc أكثر قابلية للصيانة

  • ابدأ بإعدادات قليلة ثم أضف ما تحتاجه فعلاً مع الوقت.
  • قسّم الملف إلى أقسام واضحة باستخدام تعليقات وعلامات الطي.
  • اختبر كل تعديل على حدة، ثم أعد التحميل بواسطة :source ~/.vimrc.
  • تجنب تثبيت إضافات كثيرة بلا حاجة، لأن ذلك قد يؤثر في سرعة الإقلاع.
  • دوّن سبب كل تعيين أو خيار مهم داخل تعليق مختصر ليسهل الرجوع إليه لاحقاً.

الخلاصة التقنية

تخصيص Vim عبر ملف .vimrc ليس رفاهية، بل استثمار مباشر في سرعة العمل ودقته. الإعدادات الأساسية تمنحك بيئة مستقرة، والاختصارات تقلل الجهد المتكرر، وVimscript يفتح الباب للأتمتة الذكية، بينما تجعل الإضافات وشريط الحالة التجربة أكثر اكتمالاً. الأفضل تقنياً هو بناء ملف بسيط ومنظم وقابل للتوسع، بدلاً من نسخ إعدادات ضخمة لا تفهم تفاصيلها. كل سطر تضيفه إلى .vimrc ينبغي أن يخدم استخدامك الحقيقي ويجعل المحرر أقرب إلى أسلوبك في الإنجاز.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *