all
I am new to emacs, I have a simple problem, when searching, emacs provides search by word, but when replace, how can I just replace the extract word, not a substring? I have searched on the internet, someone said to add \bfoo\b to match foo only, won't match foos but it doesn't work. Thanks.
For string-based search/replace, can run query-replace-word by typing: C-u M-%.
If you want regular expression search, then, indeed, you can enclose your regexp in either \b which matches word boundaries, or even \< and \> for beginning and end of word respectively. Make sure to use M-x replace-regexp in that case, not just M-x query-replace.
Related
The right regex I copied:
\(.\)
What I pasted after M-x isearch-forward-regexp:
\\(\.\\)
Is there a way to solve that?
isearch-yank-pop causes the yanked text to be regexp-quoted if a regexp search is in progress. The assumption is that whatever you are yanking is text to find verbatim, and not part of a regexp.
The solution is to edit the search pattern (M-e), and then yank the text into the minibuffer (C-y).
What #phils said. (Yanking in vanilla Isearch during regexp search applies regexp-quote.)
If you use library Isearch+ then:
Whether that automatic regexp-quote-ing is done or not is controlled by option isearchp-regexp-quote-yank-flag.
You can toggle that option value anytime during isearch using C-` (command isearchp-toggle-regexp-quote-yank).
Is there a module to do multiline search in Emacs ?
I have used grep, pt and now ag, and they are great. But sometimes when exploring a codebase you search for things that are on multiple lines (and therefore get nothing), but reducing the search to fewer words yields a lot of results.
Is there a way to get multiline search in Emacs in a whole project ?
Of course there is. There are multiple ways.
You don't say what kind of search you are trying to do: single file? multiple buffers? regexp? Do you need a fixed list of search hits or do you want incremental search?
Here's one simple answer:
In a Dired buffer, mark some files you want to search, then hit A.
Type a regexp to match. Use C-q C-j to enter a newline char to match. Hit RET to enter the regexp.
That searches through the marked files, stopping at each search hit in turn. Use M-, to go to the next hit, etc.
For example, to search for doc strings of variable definitions, search with this regexp or similar:
Search marked files (regexp): (defvar.*
.*"Non-nil
There's a newline char after the first .*, which you enter using C-q C-j.
There are lots of other ways to search in Emacs. The best place to start is the Search and Replace category of Emacs Wiki. There you can find ways to search broken down by main characteristics and described.
while isearch-forward run as a command, the context I had typed will hightlight in the current buffer, but while run query-replace don't hightlight that, how can i make it hightlight?
Use isearch-query-replace. It highlights the string to be replaced.
It sounds like you are saying that query-replace does not highlight all of the matching occurrences. Is that right? It should highlight them. If it does not, then try starting Emacs without your init file: emacs -Q. If that shows no lack of highlighting then recursively bisect your init file to find the culprit.
#Rocky mentioned isearch-query-replace. That doesn't change highlighting (which should already be turned on), but what it does do is let you start query-replacing while you are isearching, using the last search string as the pattern for the text to be matched by query-replace.
An alternative to query-replace, useful especially if you have relatively few replacements you want to make and there are lots of matches, is to use on-demand replacement while isearching. For that you need library Isearch+.
To replace any given search hit on demand, just hit C-M-RET. With a prefix arg, C-M-RET prompts you for the replacement text (the default is to replace with no text, which means to delete the hit). You can thus change the replacement text anytime, within the same Isearch invocation.
After replacing the search hit, C-M-RET moves to the next one. So you can just use it repeatedly if you want to replace several successive search hits. Or use C-s to skip replacing the current hit and move to the next one.
On-demand Isearch replacement works also for regexp searching, and just as for query-replacing, the replacement text can be either inserted literally, as is, or interpreted as in query-replace-regexp. In the latter case, you can use \&, \=\N, \#, \, and \?. You can use C-M-` anytime during Isearch to toggle whether replacement text is used literally or interpreted per the special regexp-replacement constructs.
The following packages provide live highlighting and replacement previewing for query replacing, as well as additional features:
https://github.com/syohex/emacs-anzu
https://github.com/benma/visual-regexp.el
https://github.com/benma/visual-regexp-steroids.el
I currently use visual-regexp-steroids.el.
All three packages can be installed from MELPA.
In vim, I could use :%sno/[abt]//g to remove all text of "[abt]" literally (as explained here).
I tried the same command in evil-mode, but it complains it doesn't understand the sno command, so how can I do the same thing in evil-mode?
To my knowledge, evil does not (yet?) support the "magic/no magic" regexp options (actually, it only does a smallish subset of ex functionality, so I don't think % will work either). As #Ehvince's answer suggests, the standard Emacs way to do the replace is with query-replace or query-replace-regexp. If you'd like to stick to evil, just escape the square brackets with a backslash:
:s/\[abt\]//g
NB: backslash escapes in Emacs often bite people coming from other environments or programming languages; have a look at the bottom of this manual node on the backslash for more information.
You would use the emacs command query-replace bound to M-%:
M-% [abt] RET <nothing> RET
and then approve each occurence with y or all with !.
The doc is at C-h f query-replace.
query-replace-regexp is bound to C-M-%.
I have 2 columns, separated by comma. How can I swap those columns with Emacs?
I have the following:
column 1,column2
x1,x2
y1,y2
f1,f2
and I want it like this:
column2,column 1
x2,x1
y2,y1
f2,f1
Use M-x query-replace-regexp and then:
\(.+\),\(.+\)
as replace regexp and
\2,\1
for replacement.
In Emacs, you need to escape grouping parentheses with \. So, above regexp would be usually written as
(.+),(.+)
which means that you want everything before comma in first group and everything after comma in second group.
\2,\1
means: write second group, then comma, then first group.
While you can apply techniques given by other people, you can also use the org-mode tables.
Once you convert the data into org-mode table, it is very easy to swap the columns by simple keystrokes. You can have M-x org-mode, select the region then do M-x org-table-convert-region, and then M- on the right most column. I am not sure, how to export the data as CSV, but that should be very easy for you with replace-regexp. This can be helpful: http://www.gnu.org/software/emacs/manual/html_node/org/Tables.html#Tables
Similar to the answer given by #darioo, type the following into the top of your buffer:
(query-replace-regexp "\\(.*?\\),\\(.*\\)" "\\2,\\1")
Then, put your cursor at the end of this line and press ctrl-x, ctrl-e.
You will have an interactive search-and-replace for which you press the space bar to make the change, and press ctrl-g to quit. If you press ! (exclamation mark) then the search will cease being interactive and take place on all matching text.
If you want to reverse the changes then press M-x (usually ESC followed by x) and type undo and press enter.
Emacs has a rectangular selection mode, see for example: http://emacs-fu.blogspot.com/2008/12/working-with-rectangular-selections.html
Even better, if you enable cua-mode, entering Ctrl-Enter will put you in rectangle selection mode that is very easy to use.
http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html
Use a macro !
Go to the first line of the buffer
Start recording a macro (F3)
Move to the beginning of the line (^a)
Search for comma (^s ,)
Transpose (M-t)
Move cursor down one line
Stop recording macro (F4)
Select the rest of the lines and:
M-x apply-macro-to-region-lines
UPDATE: This doesn't work properly if you have multiple words in a column. Looking for a more general solution...