[已解决] 如何设置在 VSCode 中打开当前文件?以及如何在 VSCode 中打开 Emacs。

逛 Reddit 时遇到了这个函数

;; https://github.com/pietroiusti/.emacs.d/blob/master/custom-functions.el
(defun gp/vscode-current-buffer-file-at-point ()
  (interactive)
  (start-process-shell-command "code"
                               nil
                               (concat "code --goto "
                                       (buffer-file-name)
                                       ":"
                                       (number-to-string (1+ (current-line))) ;; +1 who knows why
                                       ":"
                                       (number-to-string (current-column)))))

(define-key global-map (kbd "C-<escape>") 'gp/vscode-current-buffer-file-at-point)

只是改了下函数名字和绑定的快捷键

;; {{{ vscode: Visual Studio Code
(defun my/open-in-vscode ()
  (interactive)
  (start-process-shell-command "code"
                               nil
                               (concat "code --goto "
                                       (buffer-file-name)
                                       ":"
                                       (number-to-string (1+ (current-line))) ;; +1 who knows why
                                       ":"
                                       (number-to-string (current-column)))))

(define-key global-map (kbd "C-c c") 'my/open-in-vscode)
;; }}}

但是在我的 Emacs 上运行不起来,emacs -Q M-x eval-buffer 后提示:

Symbol's function definition is void: current-line

Emacs 版本:

GNU Emacs 29.0.50 (build 1, aarch64-apple-darwin22.1.0, NS
 appkit-2299.00 Version 13.0.1 (Build 22A400)) of 2022-11-23

Emacs 文档里没有对 current-line 的描述,EmacsWiki 也没搜到有用的信息。

另外补上在 Obsidian 中打开 Emacs 的做法:

倒是把 VSCode 的 Open with Emacs 配置的能用了,具体方法和代码看本帖11楼

不过还是要吐槽一下,VSCode 居然只给了 line number 不给 column number。

换成 line-number-at-pos

1 个赞

感谢感谢,附上修改后的函数。

(defun my/open-in-vscode ()
  (interactive)
  (start-process-shell-command "code"
                               nil
                               (concat "code --goto "
                                       (buffer-file-name)
                                       ":"
                                       (number-to-string (1+(line-number-at-pos)))
                                       ":"
                                       (number-to-string (current-column)))))

(define-key global-map (kbd "C-c c") 'my/open-in-vscode)
1 个赞

ExternalTools-VisualStudioMarketplace,就可以用上column-number.

{
  "vs-external-tools.externalCommand1.command": "d:/Emacs/bin/emacsclientw.exe",
  "vs-external-tools.externalCommand1.args": ["+$(CurLine):$(CurCol)", "$(ItemPath)"],
  "vs-external-tools.externalCommand1.cwd": "$(ItemDir)",
}
1 个赞

感谢感谢。

现在唯一的小瑕疵就是 Emacs 里的函数直接用 (line-number-at-pos) 会报错,只能用 (1+(line-number-at-pos))

请问有什么办法直接进行数据转换,不用 1+ 这样的 workaround 吗?

论坛里之前有分享:

1 个赞

感谢感谢,又学习了。

应该用(int-to-string (line-number-at-pos))来转成字符串。

(w32-shell-execute "open" "vscode-path" (format "-g %s:%s:%s" (buffer-file-name) (int-to-string (line-number-at-pos)) (int-to-string (current-column))))
1 个赞

:smiling_face_with_three_hearts: 感谢指点,我也给 reddit 上的老哥反馈一下。

更新从 VSCode 到 Emacs 的方法:

VSCode 的插件作者也很给力,刚反馈没多久就加上了定位光标所在列的功能,这样就可以在 VSCode 和 Emacs 中互相调用并精准定位光标位置了。

    "openInExternalApp.openMapper": [
        {
            "extensionName": "*",
            "apps": [
                {
                    "title" : "Open in Emacs",
                    "isElectronApp": false,
                    "shellCommand": "emacs +${cursorLineNumber}:${cursorColumnNumber} ${file}"
            }
        ]
        }
    ],

那可以使用终端打开的方式吗,比如这样:“emacs --nw”,另外可以指定打开的终端吗?

原理就是调用终端啊,emacs +12:5 /path/to/file 打开文件并将光标定位到底=第12行第5列。

指定终端你需要在 VSCode 里设置终端路径,跟怎么调用 Emacs 没关系吧。