# ChromeREPL [![Sublime Text 3](https://img.shields.io/badge/Sublime%20Text-3-brightgreen.svg?style=for-the-badge)](https://www.sublimetext.com/) ![Python 3.3](https://img.shields.io/badge/Python-3.3-blue.svg?style=for-the-badge) [![apm](https://img.shields.io/apm/l/vim-mode.svg?style=for-the-badge)](https://opensource.org/licenses/MIT) A SublimeText 3 Plugin to use Chrome as your [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop). Execute JavaScript in your browser. Interact with your running webapps. Live code your brains out! ### Why? Because Chrome ain't no text editor. Anything longer than a line is a pain, and so is recalling what you typed earlier. ![Screencast](img/screencast.gif) ## Installation Via Package Control (recommended! 👍👍👍) Alternatively, clone this repo into your `Packages` directory. e.g. `~/Library/Application Support/Sublime Text 3/Packages/` on macOS. If you do this you will need to open the Command Palette and run `Package Control: Satisfy Dependencies`. ## Starting Chrome Chrome needs to be started with a special flag 🏳️ (`--remote-debugging-port`). Don't worry, commands are provided to do this for you 😅. Run them by opening the Command Pallete (macOS: `cmd shift P`, win/lin: `ctrl shift P`). 1. If you haven't opened Chrome, use the `Chrome REPL: Start Chrome` command. 2. If Chrome is already running, use `Chrome REPL: Restart Chrome with remote debugging`* >**this will quit and re-open Chrome, if you want to preserve your tabs, make sure you have set this behaviour in Chrome's settings: `On start-up: Continue where you left off`.* ### 🚨 Security Warning: New User Profile 🚨 When Chrome restarts, it will use a new Chrome user profile. This is because the Chrome DevTools protocol (that is used for communication) opens a port for communication, but also exposes your cookies. To prevent people on your network from sniffing your important cookies (e.g. website logins), a temporary Chrome user profile is used. ## Usage 1. Start/Restart Chrome as above 2. Run the `Chrome REPL: Connect to Tab` command 3. Select the tab you want to connect to 4. You should see `"Sublime Text connected"` in the Chrome Developer Tools console 5. Use Shift Enter in Sublime Text to execute JavaScript code: - If you have nothing selected it will execute the current line - With code selected it will execute just the selection >Note: Each Sublime tab can be connected to one Chrome tab. The connected tab is displayed in Sublime in the status bar at the bottom of tab. ### Additional commands - `Clear Console` Cmd/Ctrl Shift C - `Reload Page` Cmd/Ctrl Shift R - `Reload Page (Ignore Cache)` Cmd/Ctrl Shift Alt R ## Settings - 📁 Path to Chrome (can be Chrome, Canary, or Chromium) - 👀 Automatically focus on connected Chrome tab (requires `wmctrl` on Linux) - 🔧 Automatically opening the Developer Tools for every new window - 🏳️ Additional chrome flags - ⌨️ Enabling the [Command Line API](https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference) - 🏠 Custom hostname and port ## Thanks The project was inspired by [SublimeWebInspector](https://github.com/sokolovstas/SublimeWebInspector/tree/master), but is far less ambitious, not as opinionated, and thus easier to maintain. This uses a *ever so slightly* modified version of [PyChromeDevTools](https://github.com/marty90/PyChromeDevTools), and a stripped down version of [Sublime Goto Window](https://github.com/ccampbell/sublime-goto-window). ## Known Issues This plugin relies on [psutil](https://github.com/giampaolo/psutil). The latest version of psutil requires Python 3.4. This means we are stuck with 5.4.1 which has a [known issue](https://github.com/giampaolo/psutil/issues/1044) on macOS to do with zombie processes. If the only option in the command palette is `Restart Chrome` then you may need to reboot your machine to clear the issue. ## Author Arthur Carabott - [arthurcarabott.com](https://arthurcarabott.com) [![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/white_img.png)](https://www.buymeacoffee.com/f1NHjKL6t)