'Find and replace in Visual Studio code in a selection

I have the following line in a file I'm editing in VSCode:

...............111.........111.............111..

I want to replace all .s with 0s. However, when I highlight the line and do a find/replace for .s, all the .s in the document are replaced, not just the ones in the line I've select, even when I toggle the "Find in selection" button. Is this a bug? In other editors, if I select a chunk of text and then do a find/replace, it will only find/replace matches within the selected block.

Below is a snippet that you should be able to reproduce the issue with. The ...............111.........111.............111.. line is inside the test_unicode function.

def test_simple2(self):
        """Simple CSV transduction test with empty fields, more complex idx, different pack_size.

        100011000001000 ->
        ..........111....................111..........11111..........111..
        """
        field_width_stream = pablo.BitStream(int('1000110001000001000', 2))
        idx_marker_stream = pablo.BitStream(int('11101', 2))
        pack_size = 4
        target_format = TransductionTarget.JSON
        csv_column_names = ["col1", "col2", "col3", "col4", "col5"]

        pdep_marker_stream = pablo.BitStream(generate_pdep_stream(field_width_stream,
                                                                  idx_marker_stream,
                                                                  pack_size, target_format,
                                                                  csv_column_names))
        self.assertEqual(pdep_marker_stream.value, 63050402300395548)

    def test_unicode(self):
        """Non-ascii column names.

        Using UTF8. Hard coded SON boilerplate byte size should remain the same, column name
        boilerplate bytes should expand.

        100010010000000 ->
        2 + 4 + 9     2 + 4 + 6     2 + 4 + 7
        ...............111.........111.............111..
        """
        field_width_stream = pablo.BitStream(int('100010001000', 2))
        idx_marker_stream = pablo.BitStream(1)
        pack_size = 64
        target_format = TransductionTarget.JSON
        csv_column_names = ["한국어", "中文", "English"]

        pdep_marker_stream = pablo.BitStream(generate_pdep_stream(field_width_stream,
                                                                  idx_marker_stream,
                                                                  pack_size, target_format,
                                                                  csv_column_names))
        self.assertEqual(pdep_marker_stream.value, 1879277596)

I'm using VSCode 1.12.2 in Ubuntu 16.04.



Solution 1:[1]

This is a more general answer for other users who come here just wanting to use basic find and replace functionality.

On Mac you can press Command + Option + F to open Find and Replace:

enter image description here

Alternatively, you can press Command + F to open Find and then click the little triangle on the left to show the Replace field:

enter image description here

Solution 2:[2]

From the VSCode devs:

We used to enable find in selection automatically when opening the find widget with a selection, but it was too easy to trigger accidentally and produced a lot of complaints. You probably want to set "editor.find.autoFindInSelection": true which will make it work the way you expect.

The VSCode GitHub issue has more details if anyone is interested.

EDIT: The autoFindInSelection option is available starting from VSCode 1.13. That version is currently in development (as of 6/7/2017), so this fix won't work until the new version is released.

Solution 3:[3]

I found the following workflow to be fairly painless:

  1. Select text region with mouse or keyboard.
  2. Ctrl+H to toggle find and replace
  3. Alt+L to toggle find in selection
  4. Ctrl+Alt+Enter to replace all (or enter to replace individually)

Solution 4:[4]

Since sometimes we might have similarly named things so you don't want to select everything, one of my favorites shortcut sequences is to select the next occurrence:

  1. Use shift and arrows to highlight the term you want to match.
  2. Use Ctrl + d to highlight the next occurrence of the term.

next occurrence selection

The Basic Editing in VS Code documentation page has some extremely useful variations on find and replace. One extremely useful shortcut is the Column (Box) Selection.

Solution 5:[5]

On Mac:

  • Select the text
  • Press command + shift + L

Solution 6:[6]

Just ran into this, my solution was to do

  1. command + N to create a new file
  2. paste my selection in there
  3. do my find and replace operations on that while file
  4. copy result back on top of my original selection

Solution 7:[7]

Okay, this is really dumb, at first I felt really stupid when I finally found this, then I realized its just VS Code which has a bad interface.

The key is, there are TWO TOOLS here, Search/Replace (the pane on the left at the top of the Explorer) and Find/Replace (which is a dialogue which opens when you press CTRL-F)

THESE ARE NOT THE SAME TOOL!!

  • SEARCH-REPLACE is a tool written for project-wide searches and changes
  • FIND-REPLACE is a small dialogue best suited for more surgical editing.

i.e. you should use FIND-REPLACE!

find replace window image with find-in-selection highlighted

Also, its SUPER IMPORTANT to follow these steps in the right order, or it doesn't give the expected results.

  1. Press CTRL-F to open the find dialogue (usually opens in the top right)
  2. press the little arrow to the right of the find field which opens the replace input field
  3. ensure "find in selection" is turned off (i.e. not highlighted)
  4. type in the fields the strings you want to search/replace
  5. select the text you want to do a search/replace within.
  6. Now press "find in selection" (or type ALT-L)
  7. You should see only highlighting in the area you previously selected.
  8. Now you can click either "replace all" (CTRL-ALT-ENTER) or line-by-line "replace" (ENTER)

I hope this helps.

My suggestion to VSC developers, there should be a refresh button so that after you have selected the area of interest, and you already have your find and replace strings defined, you can select a new region and click "refresh find" instead of needing to repeat steps 3 to 8.

Solution 8:[8]

For those where it still does not work, there is one step omitted in all of the above answers: Uncheck "Find in selection" if it is checked (which it probably is when you are struggling with it and in despair googled the problem, and then found this SO entry). Only then select the lines and then re-check "Find in selection".

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Community
Solution 3 Taylor Ellcee
Solution 4 Philippe Fanaro
Solution 5 dang
Solution 6 Rudy
Solution 7 Leigh Boyd
Solution 8 Martijn Lievaart