همة السيارات-توليد ctags
-
03-07-2019 - |
سؤال
الآن أنا في بلدي .vimrc
:
au BufWritePost *.c,*.cpp,*.h !ctags -R
هناك عدد قليل من المشاكل مع هذا:
- انها بطيئة -- تجدد الكلمات عن الملفات التي لم تتغير منذ آخر الوسم جيل.
- يجب أن تضغط على زر enter مرة أخرى بعد كتابة الملف لأن من لا مفر منه "اضغط على Enter أو اكتب الأمر أن يستمر".
عند الجمع بين هاتين المسألتين أنا في نهاية المطاف دفع إضافية تدخل مبكر جدا (قبل ctags -R
وقد انتهى) ، ثم انظر مزعج رسالة الخطأ يجب أن تضغط enter مرة أخرى.
وأنا أعلم أنه لا يبدو مثل صفقة كبيرة ، ولكن مع كمية من الملف يكتب أقوم به في يوم معين أنه يميل إلى الحصول على مزعج حقا.يجب أن يكون هناك طريقة أفضل للقيام بذلك!
المحلول
au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &
الجانب السلبي هو أنه لن يكون مفيدا فئة الملف حتى يكمل.طالما كنت على *nix النظام ينبغي أن يكون حسنا فعل متعددة يكتب قبل السابقة ctags اكتمال ولكن يجب اختبار هذا.على نظام ويندوز لن ووضعها في الخلفية و سوف يشكون من أن الملف مغلق حتى أول ctags التشطيبات (الذي لا يسبب مشاكل في همة ، ولكن عليك في نهاية المطاف مع قليلا عفا عليها الزمن العلامات الملف).
ملاحظة يمكنك استخدام --append
الخيار كما tonylo يوحي ، ولكن بعد ذلك سوف تضطر إلى تعطيل tagbsearch
مما قد يعني أن الوسم البحث تأخذ وقتا أطول ، اعتمادا على حجم الملف العلامة.
نصائح أخرى
تحرير:حل كثيرا على غرار التالية تم نشرها كما على AutoTag همة النصي.علما أن السيناريو يحتاج إلى همة مع بيثون, ومع ذلك.
الحل قذائف إلى awk بدلا من ذلك ، لذلك يجب العمل على العديد من أنظمة.
au FileType {c,cpp} au BufWritePost <buffer> silent ! [ -e tags ] &&
\ ( awk -F'\t' '$2\!="%:gs/'/'\''/"{print}' tags ; ctags -f- '%:gs/'/'\''/' )
\ | sort -t$'\t' -k1,1 -o tags.new && mv tags.new tags
لاحظ أنه يمكنك فقط اكتب بهذه الطريقة في السيناريو ، وإلا فإنه يجب أن تذهب من على خط واحد.
هناك الكثير يحدث هناك:
هذه السيارات الأمر يؤدي عند ملف تم الكشف عن أن يكون C أو C++, و يضيف بدوره العازلة-السيارات المحلية-الأوامر التي يتم تشغيلها من قبل
BufWritePost
هذا الحدث.ويستخدم
%
النائب الذي هو محل العازلة اسم الملف في وقت التنفيذ ، جنبا إلى جنب مع:gs
التعديل تستخدم شل اقتبس اسم الملف (من خلال تحويل أي جزءا لا يتجزأ من واحد يقتبس في الاقتباس-الهروب-اقتباس-اقتباس).أن الطريقة التي يدير الأمر shell أن يتحقق إذا
tags
الملف موجود في هذه الحالة محتواه المطبوعة باستثناء الخطوط التي تشير إلى مجرد حفظ الملف ، وفي الوقت نفسهctags
هو الاحتجاج على مجرد فقط-حفظ الملف ثم النتيجةsort
إد ووضع مرة أخرى في مكانها.
التحذير منفذة:وهذا يفترض أن كل شيء هو في ذاته دليل على أن هذا هو أيضا العازلة المحلية الدليل الحالي.ليس لدي أي فكرة إلى طريق الضغط.
كتبت easytags.همة للقيام بذلك فقط:تلقائيا تحديث وتسليط الضوء على العلامات.في المكونات يمكن تكوين التحديث فقط الملف الذي يتم تحريره أو كافة الملفات في الدليل الملف يتم تحريرها (بشكل متكرر).فإنه يمكن استخدام العلامات العالمية الملف, نوع الملف محددة فئة ملفات المشروع محددة فئة ملفات.
لقد لاحظت هذا هو الموضوع القديم, ومع ذلك...استخدام incron في *nix مثل البيئات الداعمة inotify.سيكون دائما من إطلاق الأوامر كلما الملفات في دليل التغيير.أي
/home/me/Code/c/that_program IN_DELETE,IN_CLOSE_WRITE ctags --sort=yes *.c
هذا هو.
وربما استخدام إلحاق حجة ctags كما يتبين من:
http://vim.wikia.com/wiki/Autocmd_to_update_ctags_file
أنا حقا لا يمكن أن يشهدوا على هذا وأنا عموما استخدام مصدر البصيرة عن كود تصفح, ولكن استخدام همة محررا...يذهب الرقم.
ماذا عن وجود ctags ومن المقرر أن تستمر عبر crontab?إذا كان المشروع الخاص بك شجرة مستقرة إلى حد ما في الهيكل ، التي ينبغي أن تكون قابلة للتنفيذ ؟
لقمع "اضغط على enter" موجه استخدام :صامت.
على OSX هذا الأمر لن ينجح في الخروج من مربع ، على الأقل بالنسبة لي.
au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &
وجدت بعد, الذي يشرح كيفية الحصول على معيار ctags الإصدار الذي يحتوي على الخيار-Rهذا وحده لم يكن العمل بالنسبة لي.كان لي أن أضيف /usr/local/bin إلى مسار متغير .bash_profile من أجل التقاط بن البيرة حيث تثبيت البرامج.
في opninion, المساعد مفهرس هو أفضل.
http://www.vim.org/scripts/script.php?script_id=3221
يمكن أن يكون:
1) إضافة على من أجل project.tar.gz
2) مستقلة المساعد
- الخلفية فئة الجيل (يجب عدم الانتظار بينما ctags يعمل)
- مشاريع متعددة المدعومة
هناك همة البرنامج المساعد يسمى AutoTag هذا يعمل بشكل جيد حقا.
إذا كان لديك taglist مثبتا فإنه سيتم أيضا تحديث هذا بالنسبة لك.
على --append
الخيار هو في الواقع وسيلة للذهاب.تستخدم مع grep -v
, يمكننا تحديث واحد فقط معلم الملف.على سبيل المثال, هنا مقتطفات من غير المصقول المساعد التي تتناول هذه المسألة.(ملحوظة::وسوف تتطلب "الخارجية" مكتبة المساعد)
" Options {{{1
let g:tags_options_cpp = '--c++-kinds=+p --fields=+imaS --extra=+q'
function! s:CtagsExecutable()
let tags_executable = lh#option#Get('tags_executable', s:tags_executable, 'bg')
return tags_executable
endfunction
function! s:CtagsOptions()
let ctags_options = lh#option#Get('tags_options_'.&ft, '')
let ctags_options .= ' '.lh#option#Get('tags_options', '', 'wbg')
return ctags_options
endfunction
function! s:CtagsDirname()
let ctags_dirname = lh#option#Get('tags_dirname', '', 'b').'/'
return ctags_dirname
endfunction
function! s:CtagsFilename()
let ctags_filename = lh#option#Get('tags_filename', 'tags', 'bg')
return ctags_filename
endfunction
function! s:CtagsCmdLine(ctags_pathname)
let cmd_line = s:CtagsExecutable().' '.s:CtagsOptions().' -f '.a:ctags_pathname
return cmd_line
endfunction
" ######################################################################
" Tag generating functions {{{1
" ======================================================================
" Interface {{{2
" ======================================================================
" Mappings {{{3
" inoremap <expr> ; <sid>Run('UpdateTags_for_ModifiedFile',';')
nnoremap <silent> <Plug>CTagsUpdateCurrent :call <sid>UpdateCurrent()<cr>
if !hasmapto('<Plug>CTagsUpdateCurrent', 'n')
nmap <silent> <c-x>tc <Plug>CTagsUpdateCurrent
endif
nnoremap <silent> <Plug>CTagsUpdateAll :call <sid>UpdateAll()<cr>
if !hasmapto('<Plug>CTagsUpdateAll', 'n')
nmap <silent> <c-x>ta <Plug>CTagsUpdateAll
endif
" ======================================================================
" Auto command for automatically tagging a file when saved {{{3
augroup LH_TAGS
au!
autocmd BufWritePost,FileWritePost * if ! lh#option#Get('LHT_no_auto', 0) | call s:Run('UpdateTags_for_SavedFile') | endif
aug END
" ======================================================================
" Internal functions {{{2
" ======================================================================
" generate tags on-the-fly {{{3
function! UpdateTags_for_ModifiedFile(ctags_pathname)
let source_name = expand('%')
let temp_name = tempname()
let temp_tags = tempname()
" 1- purge old references to the source name
if filereadable(a:ctags_pathname)
" it exists => must be changed
call system('grep -v " '.source_name.' " '.a:ctags_pathname.' > '.temp_tags.
\ ' && mv -f '.temp_tags.' '.a:ctags_pathname)
endif
" 2- save the unsaved contents of the current file
call writefile(getline(1, '$'), temp_name, 'b')
" 3- call ctags, and replace references to the temporary source file to the
" real source file
let cmd_line = s:CtagsCmdLine(a:ctags_pathname).' '.source_name.' --append'
let cmd_line .= ' && sed "s#\t'.temp_name.'\t#\t'.source_name.'\t#" > '.temp_tags
let cmd_line .= ' && mv -f '.temp_tags.' '.a:ctags_pathname
call system(cmd_line)
call delete(temp_name)
return ';'
endfunction
" ======================================================================
" generate tags for all files {{{3
function! s:UpdateTags_for_All(ctags_pathname)
call delete(a:ctags_pathname)
let cmd_line = 'cd '.s:CtagsDirname()
" todo => use project directory
"
let cmd_line .= ' && '.s:CtagsCmdLine(a:ctags_pathname).' -R'
echo cmd_line
call system(cmd_line)
endfunction
" ======================================================================
" generate tags for the current saved file {{{3
function! s:UpdateTags_for_SavedFile(ctags_pathname)
let source_name = expand('%')
let temp_tags = tempname()
if filereadable(a:ctags_pathname)
" it exists => must be changed
call system('grep -v " '.source_name.' " '.a:ctags_pathname.' > '.temp_tags.' && mv -f '.temp_tags.' '.a:ctags_pathname)
endif
let cmd_line = 'cd '.s:CtagsDirname()
let cmd_line .= ' && ' . s:CtagsCmdLine(a:ctags_pathname).' --append '.source_name
" echo cmd_line
call system(cmd_line)
endfunction
" ======================================================================
" (public) Run a tag generating function {{{3
function! LHTagsRun(tag_function)
call s:Run(a:tag_function)
endfunction
" ======================================================================
" (private) Run a tag generating function {{{3
" See this function as a /template method/.
function! s:Run(tag_function)
try
let ctags_dirname = s:CtagsDirname()
if strlen(ctags_dirname)==1
throw "tags-error: empty dirname"
endif
let ctags_filename = s:CtagsFilename()
let ctags_pathname = ctags_dirname.ctags_filename
if !filewritable(ctags_dirname) && !filewritable(ctags_pathname)
throw "tags-error: ".ctags_pathname." cannot be modified"
endif
let Fn = function("s:".a:tag_function)
call Fn(ctags_pathname)
catch /tags-error:/
" call lh#common#ErrorMsg(v:exception)
return 0
finally
endtry
echo ctags_pathname . ' updated.'
return 1
endfunction
function! s:Irun(tag_function, res)
call s:Run(a:tag_function)
return a:res
endfunction
" ======================================================================
" Main function for updating all tags {{{3
function! s:UpdateAll()
let done = s:Run('UpdateTags_for_All')
endfunction
" Main function for updating the tags from one file {{{3
" @note the file may be saved or "modified".
function! s:UpdateCurrent()
if &modified
let done = s:Run('UpdateTags_for_ModifiedFile')
else
let done = s:Run('UpdateTags_for_SavedFile')
endif
endfunction
ويحدد هذا القانون:
^Xta
لإجبار التحديث من فئة قاعدة لجميع الملفات الموجودة في المشروع الحالي ;^Xtc
لإجبار التحديث من فئة قاعدة الحالية (غير محفوظة) ؛- وهو autocommand أن التحديثات العلامات قاعدة في كل مرة يتم حفظ الملف ;وهو يدعم العديد من الخيارات إلى تعطيل التحديث التلقائي حيث لا نريد ، لحن ctags المكالمات اعتمادا على نوع الملف, ...انها ليست مجرد نصيحة, ولكن مقتطفات صغيرة من البرنامج المساعد.
HTH,
السيارات الوسم هو همة المساعد أن التحديثات الموجودة الوسم الملفات على حفظ.
لقد تم استخدامه لسنوات دون مشاكل باستثناء أنه يفرض الحد الأقصى لحجم على فئة ملفات.إلا إذا كان لديك مجموعة كبيرة حقا من رمز كل فهرستها في نفس فئة الملف يجب أن لا تصل إلى هذا الحد ، على الرغم من.
علما بأن السيارات الوسم يتطلب بيثون في همة.