سؤال

الآن أنا في بلدي .vimrc:

au BufWritePost *.c,*.cpp,*.h !ctags -R

هناك عدد قليل من المشاكل مع هذا:

  1. انها بطيئة -- تجدد الكلمات عن الملفات التي لم تتغير منذ آخر الوسم جيل.
  2. يجب أن تضغط على زر 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

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

هناك الكثير يحدث هناك:

  1. هذه السيارات الأمر يؤدي عند ملف تم الكشف عن أن يكون C أو C++, و يضيف بدوره العازلة-السيارات المحلية-الأوامر التي يتم تشغيلها من قبل BufWritePost هذا الحدث.

  2. ويستخدم % النائب الذي هو محل العازلة اسم الملف في وقت التنفيذ ، جنبا إلى جنب مع :gs التعديل تستخدم شل اقتبس اسم الملف (من خلال تحويل أي جزءا لا يتجزأ من واحد يقتبس في الاقتباس-الهروب-اقتباس-اقتباس).

  3. أن الطريقة التي يدير الأمر 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,

السيارات الوسم هو همة المساعد أن التحديثات الموجودة الوسم الملفات على حفظ.

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

علما بأن السيارات الوسم يتطلب بيثون في همة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top