views:

531

answers:

6

How to open files in browsers (e.g Firefox) within editors like vim or emacs? Notepad++ open files in browsers by pressing Ctrl+Shift+Alt+X (Firefox). Is there a way to do this in gVim or Emacs?

A: 

You mean you'd like to open the file currently being edited in a web browser?

In Vim, use something like :!firefox %.

Edit: You could, in fact, use nmap <silent> <C-M-X> :!firefox %<CR> to cause Vim to act very much like Notepad++ (though this mapping won't care whether you press shift or not).

Note that not every browser will actually render the file's contents when given the filename on the command line; e.g. Google Chrome will open a "save as" dialogue instead, as if you were downloading the file in question. Look up your browser's docs if in doubt. Firefox will 'just work', though.

Michał Marczyk
If you mean the filename under the cursor use <cword> in place of %.
Laurence Gonsalves
@Laurence: Right! Thanks for pointing this out. :-)
Michał Marczyk
@janoChen: Well, it should definately work if you've got the `firefox` executable on your path. This would not necessarily be the case if you're on Windows; in that case, replace `firefox` with something like `C:/path/to/firefox.exe`. Generally speaking, you'll need to figure out what command to use to open a file with your browser **on the command line** (that's `firefox name-of-the-file` on my box) and use that instead of `firefox`, with % (or <cword>, following Laurence's suggestion) in place of the actual filename. Let me know if this doesn't help.
Michał Marczyk
should my path look something like this? 'nmap <silent> <C-M-X> :!D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe'
janoChen
<C-M-X> = ctrl+alt+x, yes, but nothing *will* happen until you execute that `nmap ...` command I suggested in the answer. Also, `nmap` makes the mapping only work in normal mode, which is normally the mode you're in when you start Vim and which you can normally get back into by pressing Esc. Use `:help map` for information on other mapping commands (`map`, `imap` etc.) which produce mappings accessible from other modes. Finally, it won't work if the basic `:!firefox %` doesn't work, you need to figure out the correct command first, then use it in the mapping.
Michał Marczyk
Yeah, that would be what your path should look like. Does it work now?
Michał Marczyk
Thanks for the help but still not working. I placed "nmap <silent> <C-M-X> :!D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe" in my _vimrc. Tried to execute it with Crtl + Alt + X in normal mode. Nothing happened. (I also tried "nmap <silent> <C-M-X> :D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe" (without the !)
janoChen
You need the `!`, because that's what tells Vim you want to execute an external programme. Also, skip the mapping for now; try `:!D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe %` and let me know what goes wrong. Maybe I can help then.
Michał Marczyk
Yes I just tried ":!D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe %" in normal mode and it opened the cmd showing me the path of firefox and the file (index.html). Shell return 1. Hit any key to close this window.
janoChen
Well, I haven't got a Windows box at hand to check this, but I understand that if you open a cmd.exe window and type in `D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe your_file.html`, then Firefox opens your file? (I wonder if this question perhaps belongs on Superuser, rather than here... oh well.)
Michał Marczyk
"D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe" _< this open firefox. "D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe your_file.html" <- this won't open my file. I think it can't find the file path. Maybe doesn't work on Windows.
janoChen
OK, in that case, try using `:exec "!D:\Program Files\Mozilla Firefox 3.6 Beta 5\firefox.exe " . expand("%:p")`. If this doesn't work (although it really, really should), try using `@%` instead of the `expand("%:p")` bit. Note there's a space after firefox.exe, before the closing double quote.
Michał Marczyk
+3  A: 

In emacs I don't think this is built in, I may be wrong, but if not here is a function to do it:

(defun open-in-browser()
  (interactive)
  (let ((filename (buffer-file-name)))
    (browse-url (concat "file://" filename))))
justinhj
this is definitely built in, no need to role your own
Justin Smith
Yup, `browse-url-of-file' in minaev's answer.
justinhj
+1  A: 

In gVim:

:!start cmd /c "C:\Users\pierre\AppData\Local\Google\Chrome\Application\chrome.exe" file:///"%:p""

You need the file:// URI to indicate that it is from the file system, this will work with all browsers. %:p produces the full file path for the current file. The quotes are necessary.

Simply map that to whatever you choose. You may need to do set shell=cmd.exe if you've set your shell to bash or something else.

In emacs (quoting justinhj):

(defun open-in-browser()
  (interactive)
  (let ((filename (buffer-file-name)))
    (browse-url (concat "file://" filename))))

Pierre-Antoine LaFayette
+2  A: 

Depending what you want to do with this, you might consider Emacs + MozRepl, which basically lets you send javascript commands to Firefox via telnet. Unfortunately I can't seem to write the elisp to make this work, but a related trick for reloading webpages from within emacs is shown by Sard in What's in your .emacs?. More information on integrating emacs and mozrepl from the original source and also here for a cool trick that updates the page in the browser as you type in the emacs buffer - it's pretty nice for getting instant feedback when working with html.

I reckon the same thing would work with vim, but I've only used it in emacs.

allclaws
+3  A: 

browse-url-of-file is an interactive compiled Lisp function in `browse-url.el'.

It is bound to , C-c C-z v.

(browse-url-of-file &optional file)

Ask a WWW browser to display file. Display the current buffer's file if file is nil or if called interactively. Turn the filename into a URL with function browse-url-file-url'. Pass the URL to a browser using the browse-url' function then run `browse-url-of-file-hook'.

+1  A: 

For whatever reason, my EmacsW32 on WinXP install kept sending browse-url directives to shell with "open file:// alone, and that didn't work so well*. Cutting it off at the knees, and modifying justin's original as below worked for me:

(defun open-in-browser()
"open buffer in browser, unless it is not a file. Then fail silently (ouch)."
  (interactive)
  (if (buffer-file-name)
      (let ((filename (buffer-file-name)))
        (shell-command (concat "start firefox.exe \"file://" filename "\"")))))

Needs some improvement. As well as replacement of your favorite browser. d**n you, hard-coding.

* I think the problem was the system-type check in browse-url-default-windows-browser, but not positive.

Michael Paulukonis