nachocab
nachocab

Reputation: 14364

How can I manually edit the list of recently opened files in VS Code?

I rely heavily on the File: Open Recent… command to open frequently used files, but yesterday my local Google Drive folder got moved to a new location and now I can no longer access any of the files in that folder through the Open Recent panel because the paths don't match.

The fix would be as simple as replacing "/Google Drive/" with "/Google Drive/My Drive/" but I have no idea what file contains the list of files that appears in the recently opened panel.

I'm assuming it's somewhere in ~/Library/Application Support/Code but not sure where.

Upvotes: 13

Views: 3168

Answers (2)

Daniel Price
Daniel Price

Reputation: 21

To add to Eli Finkel's answer, the location on Mac is ~/Library/Application Support/Code/User/globalStorage/state.vscdb

Upvotes: 2

Eli Finkel
Eli Finkel

Reputation: 593

I was wondering the same thing the other day and found this while searching for a solution, so I took some time to investigate it today.
It's been a a few weeks since you posted, so hopefully this will still be of help to you.
Also, I'm using Windows and I'm not familiar with macOS, but I think it should be easy enough adjust the solution.

Location of settings
Those setting are stored in the following file: %APPDATA%\Code\User\globalStorage\state.vscdb. The file is an sqlite3 database, which is used as a key-value store. It has a single table named ItemTable and the relevant key is history.recentlyOpenedPathsList.

The value has the following structure:

{
  "entries": [
    {
      "folderUri": "/path/to/folder",
      "label": "...",
      "remoteAuthority": "..."
    }
  ]
}

To view the current list, you can run the following command:

sqlite3.exe -readonly "%APPDATA%\Code\User\globalStorage\state.vscdb" "SELECT [value] FROM ItemTable WHERE [key] = 'history.recentlyOpenedPathsList'" | jq ".entries[].label"

Modifying the settings
Specifically, I was interested in changing the way it's displayed (the label), so I'll detail how I did that, but it should be just as easy to update the path. Here's the Python code I used to make those edits:

import json, sqlite3

# open the db, get the value and parse it
db = sqlite3.connect('C:/Users/<username>/AppData/Roaming/Code/User/globalStorage/state.vscdb')
history_raw = db.execute("SELECT [value] FROM ItemTable WHERE  [key] = 'history.recentlyOpenedPathsList'").fetchone()[0]
history = json.loads(history_raw)

# make the changes you'd like
# ...

# stringify and update
history_raw = json.dumps(history)
db.execute(f"UPDATE ItemTable SET [value] = '{history_raw}' WHERE key = 'history.recentlyOpenedPathsList'")
db.commit()
db.close()

Code references
For reference (mostly for my future self), here are the relevant source code areas.
The settings are read here.
The File->Open Recent uses those values as-is (see here). However when using the Get Started page, the Recents area is populated here. In the Get Started, the label is presented in a slightly different way:
vscode snapshot
The folder name is the link, and the parent folder is the the text beside it. This is done by the splitName method.

Notes

  • Before messing around with the settings file, it would be wise to back it up.
  • I'm not sure how vscode handles and caches the settings, so I think it's best to close all vscode instances before making any changes.
  • I haven't played around with it too much, so not sure how characters that need to be json-encoded or html-encoded will play out.
  • Keep in mind that there might be some state saved by other extensions, so if anything weird happens, blame it on that.
  • For reference, I'm using vscode 1.74.2.

Links

Upvotes: 13

Related Questions