Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Version 1.0: Initial upload

  • Loading branch information...
commit 86b6b12b8ab0f120e27907061075924c543e8238 0 parents
Luinnar . authored committed
Showing with 375 additions and 0 deletions.
  1. +40 −0 README
  2. +92 −0 README.html
  3. +37 −0 find_above
  4. +115 −0 plugin/findusage.vim
  5. +91 −0 utags
40 README
@@ -0,0 +1,40 @@
+This is a mirror of http://www.vim.org/scripts/script.php?script_id=3778
+
+UTAGS
+
+WHAT IS IT.
+
+Utags provides an ability to search for usage of a C/C++/Python/Perl function, a type name, a class method/member, a variable or any other word in a source code of a project. It's like a fast, convenient grep by the whole word. Search is performed from vim by a hot-key when cursor is on the word you want to find. It works quickly since utags uses a beforehand generated index.
+
+HOW TO USE IT.
+
+First of all you should generate an index. It's done by the following command:
+cd your_proj_path && utags -g . > .utags
+It can take a while for big projects.
+Further when you edit a file from the project and current folder is a project subfolder and the vim cursor is on the word you want to find in the project, press and release one by one two keys: <\> and <U> (without delay between pressing, quite quickly; letter U is in uppercase here, so press it holding Shift). If you have done everything right, vim opens a window in the top with a list of results.
+
+A couple of other hot-keys limit the search area:
+<\>, <D> - search only in the C/C++ headers.
+<\>, <P> - search only in the current directory.
+Letters D and P are in upper case here too, so press them with Shift held.
+
+Key <\> is defined by vim configuration and can be changed, for example, on a comma by adding the following line into $HOME/.vimrc:
+ let mapleader = ","
+
+GOING THROUGH RESULTS.
+
+You may select items from the result list using mouse double-click or using a keyboard (arrows and Enter). In order to move vim cursor in the bottom window using keyboard press <Ctrl>+<w>, <Down>, and to return to the top window: <Ctrl>+<w>, <Up>.
+
+You also may assign hot-keys to go thru the result list faster:
+map <F6> :copen<CR>
+map <F7> :cprevious<CR>
+map <F8> :cnext<CR>
+
+These lines should be added to $HOME/.vimrc
+
+If you have any question about this tool or know how to enhance it, please email me at luinnar(at)yandex.ru
+
+Have a fun!
+
+In English: http://luinnar.narod.ru/tools/utags/index-en.html
+На русском: http://luinnar.narod.ru/tools/utags/
92 README.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
+ <TITLE>utags - Universal Tags</TITLE>
+ <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Unix)">
+ <META NAME="AUTHOR" CONTENT="Alexei Mozhaev">
+ <META NAME="CREATED" CONTENT="20111019;16015500">
+ <META NAME="CHANGEDBY" CONTENT="Alexei Mozhaev">
+ <META NAME="CHANGED" CONTENT="20111019;16023800">
+ <STYLE TYPE="text/css">
+ <!--
+ @page { margin: 0.79in }
+ P { margin-bottom: 0.08in }
+ H2 { margin-bottom: 0.08in }
+ A:link { so-language: zxx }
+ -->
+ </STYLE>
+</HEAD>
+<BODY>
+
+<H1>UTAGS</H1>
+
+<H2><A NAME="h113876-1"></A>1. Что это такое.&nbsp;&nbsp;</H2> <P><A
+NAME="2.kakjetopoluchit"></A>Поиск по проекту всех мест в
+<STRONG>C/C++</STRONG>, <STRONG>Python</STRONG> и <STRONG>Perl</STRONG> коде,
+где используется та или иная функция, класс, члены/методы класса, структура,
+тип, константа, переменная и вообще любое слово из кода. Поиск осуществляется
+прямо из vim по горячей клавише, когда курсор находится на нужном слове.
+Работает довольно быстро, т.к. использует предварительно подготовленный
+индекс.</P>
+
+<H2><A NAME="h113876-2"></A>2. Как это получить.&nbsp;&nbsp;</H2>
+<P><A NAME="p75518-1"></A>Для этого вам понадобится
+скопировать к себе на машину три
+файла:<BR><A HREF="utags" TARGET="_blank">utags</A> (shell script) <BR>
+<A HREF="find_above" TARGET="_blank">find_above</A> (shell script) <BR>
+<A HREF="findusage.vim" TARGET="_blank">findusage.vim</A></P>
+<P><A NAME="3.kakispolzovat"></A><BR>Первые два файла
+скопируйте в любой ваш каталог, который
+уже находится в переменной PATH, если
+такового нет, то создайте его и добавьте
+в PATH.<BR>Последний файл - это плагин для
+vim'а, скопируйте его к себе в папку
+$HOME/.vim/plugin/ (если такой нет, создайте!).</P>
+
+<H2><A NAME="h113876-3"></A>3. Как использовать.&nbsp;&nbsp;</H2>
+<P><A NAME="p75518-2"></A>Сначала нужно сгенерировать
+базу слов. Делается это, например, так:<BR><STRONG>cd
+your_proj_path &amp;&amp; utags -g . &gt; .utags</STRONG><BR>
+Для больших проектов генерация тэгов может занять продолжительное время.</P>
+<P><A NAME="p75518-31"></A>Затем, когда вы находитесь в одной из папок проекта
+и редактируете какой-либо файл на любом уровне вложенности, находясь на
+интересующем вас слове, нажмите поочереди две клавиши:
+&lt;<STRONG>\</STRONG>&gt; и &lt;<STRONG>U</STRONG>&gt; (нажимать нужно без
+долгой задержки, быстро, буква U здесь большая, т.е. нажимать с зажатым shift).
+Тогда vim откроет в нижнем окне список использования данного слова по всем
+исходникам проекта. </P>
+<P><A NAME="p75518-41"></A>Есть еще пара сочетаний,
+которые позволяют ограничить область
+поиска:<BR>&lt;<STRONG>\</STRONG>&gt;, &lt;<STRONG>D</STRONG>&gt;
+- поиск только по хэдерам<BR>&lt;<STRONG>\</STRONG>&gt;,
+&lt;<STRONG>P</STRONG>&gt; - поиск только по текущей
+папке<BR>Буквы D и P здесь тоже большие,
+используем <STRONG>Shift</STRONG>.</P>
+<P><A NAME="p75518-51"></A>Клавиша &lt;<STRONG>\</STRONG>&gt;
+здесь определяется настройками vim'а -
+это клавиша &lt;Leader&gt;, которую можно
+поменять, например, на запятую добавив
+в $HOME/.vimrc команду:</P>
+<BLOCKQUOTE>:let mapleader = &quot;,&quot;</BLOCKQUOTE>
+<P><A NAME="4.peremeshheniepospiskurezultatov"></A>
+</P>
+
+<H2><A NAME="h113876-4"></A>4. Перемещение по списку результатов.&nbsp;&nbsp;</H2>
+<P><A NAME="p75518-61"></A>По списку можно перемещаться
+дабл-кликом или с помощью клавиатуры
+(стрелочки и Enter). Перевести курсор в
+нижнее окно с помощью клавы - &lt;Ctrl&gt;+&lt;w&gt;,
+&lt;Down&gt;, а обратно в верхнее - &lt;Ctrl&gt;+&lt;w&gt;,
+&lt;Up&gt;.</P>
+<P><A NAME="p75518-71"></A>По желанию можно добавить мапы для вима для
+перемещения по полученному списку. Например, такие:</P>
+<BLOCKQUOTE>map &lt;F6&gt; :copen&lt;CR&gt;<BR>map &lt;F7&gt;
+:cprevious&lt;CR&gt;<BR>map &lt;F8&gt; :cnext&lt;CR&gt;</BLOCKQUOTE>
+<P><A NAME="p75518-81"></A>Эти строки следует добавлять в <STRONG>$HOME/.vimrc</STRONG></P>
+<P><A NAME="p75518-91"></A>Если остались вопросы или есть предложения по
+улучшению данной тулзы, пишите мне на мыло: luinnar(at)yandex.ru</P>
+<P><A NAME="p75518-101"></A>Have a fun! </P>
+
+</BODY>
+</HTML>
37 find_above
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+# Maintainer: Alexei Mozhaev
+# Last Change: 09-Jun-11
+
+relpath_only=0
+case "$1" in
+ --relpath) relpath_only=1; shift ;;
+esac
+
+[ $# -lt 1 ] && echo "Usage: `basename $0` --relpath file-name [dir]" && exit 1
+
+fname="$1"
+if [ -z "$2" ]; then
+ dir="`pwd`"
+else
+ dir="`(cd "$2" && pwd)`"
+fi
+
+relpath=''
+
+while [ -d "$dir" ]
+do
+ if [ -f "$dir/$fname" ]; then
+ if [ $relpath_only -eq 0 ]; then
+ echo "$dir/$fname"
+ else
+ [ -n "$relpath" ] && echo "$relpath" || echo './'
+ fi
+ exit 0
+ fi
+ dir_above="${dir%/*}"
+ [ "$dir_above" == "$dir" ] && break
+ dir="$dir_above"
+ [ -z "$relpath" ] && relpath=".." || relpath="../$relpath"
+done
+exit 1
115 plugin/findusage.vim
@@ -0,0 +1,115 @@
+" Maintainer: Alexei Mozhaev
+" Last Change: 14-Jun-11
+
+let $utags = "utags"
+
+if empty($proj)
+ let $proj="."
+endif
+
+"------------------------------------------------------------------------
+func! FindUsageShowResults( title )
+"------------------------------------------------------------------------
+ copen
+ set cul
+ set number
+ silent exe "file ".a:title
+endfunc
+
+"------------------------------------------------------------------------
+func! FindCodeFilesCmd( path )
+"------------------------------------------------------------------------
+ return "find ".a:path." -type f -name '*.[ch]' -o -name '*.[ch]pp' -o -name '*.[ch]xx' -o -name '*.py' -o -name '*.sh'"
+endfunc
+
+"------------------------------------------------------------------------
+func! AddCmdFilter( cmd, filter )
+"------------------------------------------------------------------------
+ return " ( ".a:cmd." ) | " . a:filter
+endfunc
+
+"------------------------------------------------------------------------
+func! AddEqualFilesFilter( cmd )
+"------------------------------------------------------------------------
+ return AddCmdFilter( a:cmd, "awk -F/ '{ if(files[$NF]!=1) {files[$NF]=1; print;} }'" )
+endfunc
+
+"------------------------------------------------------------------------
+func! FindTagFiles( tagname, filter, proj_only )
+"------------------------------------------------------------------------
+ let cmd = ''
+
+ if !empty($proj)
+ let cmd .= FindCodeFilesCmd( "$proj -maxdepth 1" ) . ";"
+ endif
+
+ if !a:proj_only
+ let cmd .= "$utags -t " . a:tagname . ";"
+ endif
+
+ if !empty(a:filter)
+ let cmd = AddCmdFilter( cmd, a:filter )
+ endif
+
+ let cmd = AddEqualFilesFilter( cmd )
+
+ "echo "Performing command: ".cmd
+ return system( cmd )
+endfunc
+
+"------------------------------------------------------------------------
+func! FindTextFiles( text )
+"------------------------------------------------------------------------
+ let cmd = ''
+
+ if !empty($proj)
+ let cmd .= "find \"$proj\" -maxdepth 1 -type f -name '*';"
+ endif
+
+ "if filereadable($utags)
+ "let cmd .= "$utags -q -t -l " . a:text . ";"
+ "endif
+
+ let cmd = AddEqualFilesFilter( cmd )
+
+ return system( cmd )
+endfunc
+
+" This function searches identificator usage via wus (lxr_ident)
+" and shows the usage list in the Error window of vim
+"------------------------------------------------------------------------
+func! FindTagUsage( tagname, file_regexp, proj_only )
+"------------------------------------------------------------------------
+ echo "Searching usage of ".a:tagname." ..."
+
+ let grep_cmd = ""
+ if strlen( a:file_regexp ) > 0
+ let grep_cmd = "grep '".a:file_regexp."'"
+ endif
+
+ let flist = FindTagFiles( a:tagname, grep_cmd, a:proj_only )
+ let flist = substitute( flist, "\n", " ", "g" )
+ exec 'silent vimgrep! "\<'.a:tagname.'\>" '.flist
+
+ call FindUsageShowResults( a:tagname )
+endfunc
+
+" This function searches identificator usage via wus (lxr_ident)
+" and shows the usage list in the Error window of vim
+"------------------------------------------------------------------------
+func! FindTextUsage( text )
+"------------------------------------------------------------------------
+ echo "Searching text ".a:text." ..."
+
+ let flist = FindTextFiles( a:text )
+ let flist = substitute( flist, "\n", " ", "g" )
+ exec 'silent vimgrep! "'.a:text.'" '.flist
+
+ call FindUsageShowResults( a:text )
+endfunc
+
+" Perform usage search for the word under cursor
+map <Leader>U :call FindTagUsage( expand("<cword>"), "", 0 )<CR>
+map <Leader>P :call FindTagUsage( expand("<cword>"), "", 1 )<CR>
+map <Leader>D :call FindTagUsage( expand("<cword>"), "\.h$", 0 )<CR>
+map <Leader>T :call FindTextUsage( expand("<cword>") )<CR>
91 utags
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash
+
+# Maintainer: Alexei Mozhaev
+# Last Change: 05-Jul-11
+
+WORD_CHARS='_a-zA-Z0-9'
+MAX_FILE_NUM=100
+
+function usage_exit()
+{
+ name=`basename $0`
+ echo "Usage:"
+ echo " $name -g|--generate-tags [-n|--numbers] dirs"
+ echo " $name -t|--find-tag tag [utagsfile]"
+ echo " $name -h|--help"
+ exit 1
+}
+
+function grep_source_code_files()
+{
+ while read fname
+ do
+ name="${fname/*\/}"
+ ext="${name/*.}"
+ case "$ext" in
+ "$name") # i.e. no extension
+ case "`file -b "$fname"`" in
+ *python*)
+ echo "$fname"
+ ;;
+ esac
+ ;;
+ *) # consider all files with extensions are source code files
+ echo "$fname"
+ ;;
+ esac
+ done
+}
+
+[ $# -lt 2 ] && usage_exit
+
+case "$1" in
+ -t|--find-tag)
+ tag="$2"
+
+ if [ $# -gt 2 ]; then
+ tagsfile="$3"
+ elif [ -n "$proj" ] && [ -f "$proj/.utags" ]; then
+ tagsfile="$proj/.utags"
+ else
+ tagsfile="`find_above .utags 2> /dev/null`"
+ [ $? -eq 0 ] || exit 1
+ fi
+ dir="`dirname "$tagsfile"`"
+ awk '$1 == "'"$tag"'" {for(i=3; i<=NF; ++i) print $i; exit;}' "$tagsfile" | sed 's@^\./@@' | sed '/^[^/]/s@^@'"$dir/"'@g'
+ ;;
+
+ -g|--generate)
+ shift
+
+ num_tags=0
+ case "$1" in
+ -n|--numbers) num_tags=1; shift ;;
+ esac
+
+ find $@ -type f -name "*.[ch]" -o -name "*.[ch]pp" -o -name "*.in*" -o -name "*.py" -o -name "*.p[lm]" -o -name "*.sfdl" -o \! -name "*.*" |
+ grep_source_code_files |
+ sed 's@^\./@@' |
+ while read fname
+ do
+ echo "file: $fname"
+ cat "$fname" | tr -sc "$WORD_CHARS" '\n' | uniq | sort -u | grep -v '^[0-9]' | grep '.'
+ # There can be lots of numeric constants in the source code, so enable it only if you realy want to search them
+ [ $num_tags -eq 1 ] &&
+ cat "$fname" | tr -sc "0-9" '\n' | uniq | sort -u | grep '.'
+ done |
+ awk '
+ $1 == "file:" { file = $2; next; }
+ {
+ if (counts[$1] < '"$MAX_FILE_NUM"')
+ tags[$1] = tags[$1]" "file;
+ counts[$1]++;
+ }
+ END { for(tag in tags) print tag, counts[tag], tags[tag]; }
+ ' | sort -nk2
+ ;;
+
+ -h|--help)
+ usage_exit
+ ;;
+esac
Please sign in to comment.
Something went wrong with that request. Please try again.