Wednesday, May 21, 2014

Re: How can I pass user input value to vimgrep?


On May 21, 2014 11:46 PM, "Pinaki" <appugupta007@gmail.com> wrote:
>
> I am trying to write a small script to mimic the Notepad++ 's 'Find in Files'
> feature.
> First it collects information from the user e.g. search item, directory and
> file-type,
> then it should start performing.
> I got stumbled somewhere, after searching the Internet a lot
> I did not find any solution that worked in my case.
> Here is the detail:
>
> " ------------Find_in_Files.vim------------
> " -----------------------Implementation of a simple feature
> " -----------------------"Find in Files and Directories"
> " -----------------------like Notepad++ -----------------
>
>
> :menu Edit.Find\ in\ Files  :<Esc>:<Esc>:call Find_in_Files() <Cr>
>
> function Find_in_Files()
>
> " -----------------------raw method-----------------
> " :vimgrep /GNU/ C:\CodeBlocks\TDM-GCC-64\include\*.txt
> " :cw
> " --------------------------------------------------
>
>         let what2find = inputdialog("search term", "", "cancel pressed")
>         let     directory       = browsedir("Browse the directory","")
>         let filetype = inputdialog("filetype", "", "cancel pressed")
>     if what2find != "" && what2find != "cancel pressed" && directory !=  ""
> && filetype !=  ""
>
>
>         " :exe "!vimgrep /".what2find "\b/" " " .directory "\b\*." .filetype
> " not working
>         :execute "vimgrep /".what2find "\b/" " " .directory "\b\*."
> .filetype

What are you trying to do with \b here? At first occurrence of \b it simply means that you search for literal CTRL-H that is preceded by what2find *followed by a space*. At second it means that you are searching for file with given extension and name starting with CTRL-H *in the current directory* and in file named directory. I think you must do the following:

1. To get rid of unneeded spaces use concat operator (dot).
2. Remove quoted space before directory: needed space is inserted by :execute (unless you use concat operator).
3. Use fnameescape() to escape directory name.
4. Additionally escape forward slash in what2find using escape(). Also make sure that what2find does not end with unescaped backward slash.
5. Replace all string comparisons with ==# or ==?. Better with is# or is?. *Never* use == for string comparison, == depends on the value of &ignorecase option. is#/is? must be used if you expect operands to have different types and one of the operands definitely has scalar type. Though I just use them always for string comparison, even if I know for sure that both operands will be strings.

   Same is true for !=: use !=#/!=? or isnot#/isnot?. (Hash stands for 'noignorecase', ? stands for 'ignorecase'.)

>         :cw
>                   " also not working

:cw does not work if there are no search results.

>
>     else
>         "process if user press okay
>         if what2find != "cancel pressed" && directory !=  "cancel pressed"
> && filetype !=  "cancel pressed"
>                " I will repeat the same here if something goes well
>         endif
>     endif
> endfunction
>
>
>
> This plug-in is working partially, all the problem comes when I pass a
> variable value from the user input to vimgrep.
> If there is any fix to this problem please let me know.
>
>
>
>
>
> --
> View this message in context: http://vim.1045645.n5.nabble.com/How-can-I-pass-user-input-value-to-vimgrep-tp5721661.html
> Sent from the Vim - General mailing list archive at Nabble.com.
>
> --
> --
> You received this message from the "vim_use" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to the Google Groups "vim_use" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: