spacemacs Python Layer的snippet

不好意思再问一下,我把python mode的放到我的Private snippet文件夹下的确生效了可是java mode却没有入法炮制成功,可是菜单栏的yasnipper里却明明显示有的,我看到python mode下面除了snipper意外还有很多其他的文件,不知有没有关系…

这是我原搬山人的配置。

这里定义了下snippet路径。

(defun ztlevi/load-yasnippet ()
  (interactive)
  (unless yas-global-mode
    (progn
      (yas-global-mode 1)
      (setq my-snippet-dir (expand-file-name "~/.spacemacs.d/snippets"))
      (setq yas-snippet-dirs  my-snippet-dir)
      (yas-load-directory my-snippet-dir)
      (setq yas-wrap-around-region t)))
  (yas-minor-mode 1))

这段有个remove-hook和add-to-hooks的过程,如果你不是自己定义layer的话,只要把progn里面的内容放到dotspacemacs/user-config里面就行了

(defun ztlevi-programming/post-init-yasnippet ()
  (progn
    ;; remove yas-installed-snippets-dir from yas-snippet-dirs
    (with-eval-after-load 'yasnippet
      (setq yas-snippet-dirs (remq 'yas-installed-snippets-dir yas-snippet-dirs)))

    (set-face-background 'secondary-selection "gray")
    (setq-default yas-prompt-functions '(yas-ido-prompt yas-dropdown-prompt))
    (mapc #'(lambda (hook) (remove-hook hook 'spacemacs/load-yasnippet)) '(prog-mode-hook
                                                                           org-mode-hook
                                                                           markdown-mode-hook))

    (spacemacs/add-to-hooks 'ztlevi/load-yasnippet '(prog-mode-hook
                                                     markdown-mode-hook
                                                     org-mode-hook))
    ))

.yas_parents就是指定parent mode,它下面的所有snippet都会继承,.yas_setup.el就是针对各个mode进行一些修改,我也是从yasnippet github repo那里直接拿过来的,具体没看过。应该不是这里的问题。

1 个赞

哼没起作用… 我有空好好研究u研究 暂时先用visual studio code编java吧,顺便也看到了你的vsc leader key设置,照抄下哈哈哈~

主要就是yas-snippet-dirs,默认有("~/.emacs.d/snippets" yas-installed-snippets-dir),spacemacs会自动加上~/.spacemacs.d/snippets

想问下你的emacs里java会出现自动补全吗,感觉没人在emacs里用java 我的python是没有问题的但是java就不行,我在google上看了一会好像不少人有这个问题但是也没有人解决

有点崩溃,不知道怎么回事我瞎弄了一些东西自己好了,得,就这样了…

Spacemacs 的 Java 補全似乎要用 Eclipses 當後端。

比较好奇楼主为什么会从号称宇宙最强 IDE 的 VS Code 跳到 spacemacs

我从全宇宙次强的IDE jb家跳到spacemacs,原因有:

  • vim插件有差距,随便找一条vim技巧来尝试,ideaVim有50%可能不能用,evil只有10%
  • jb虽好,不能让我在foo(❚)时按下我自己绑定的C-;使代码变成foo(❚);然后继续在括号内编辑。

哈哈没有呀两个都用,宇宙最强的编辑器也太多了,用spacemacs是特别喜欢他的leader key还有各种各tweak,大神也多不像vscode很多都是半知半解copy设置的,上端社区质量没emacs高哈哈哈~但是各有各的好吧,我觉比较很无聊,学习~

还有我是搞自然语言处理的,感觉用emacs处理text应该也挺给力的

这个我看过但是暂时还是很少人用.话说你那个在括号里control ; 的代码能让我学习下不呵呵~

(defun insert-semi-at-eol ()
    "Insert semicolon at end of line."
    (interactive)
    (save-excursion
      (end-of-line)
      (insert ";")
      )
    )
(define-key evil-insert-state-map (kbd "C-;") 'insert-semi-at-eol)

内置save-excursion保存光标位置,秒速实现黑魔法 :beers:

2 个赞

看了两位的留言,感觉 VS Code 作为 IDE 可能是宇宙最强,但是作为编辑器来讲, emacs 第二没人敢当第一啊, :rofl::rofl::rofl::rofl::rofl::rofl::rofl::rofl:

java还是ide或者vs code走起吧。。。目前没啥完美的解决方案

这个确实是,ideavim visual selection还跟某些功能冲突,比方说extend region使用的还是原来的选择模式,而不是ideavim的,就无法删除。

嘿嘿我把他改为全局Key了顺便加了个在结尾加了个(newline),多谢多谢! 第一天入坑的我还是挺高兴的。

改进版,判断行尾字符决定是 insert 还是 remove,支持多行:

(defun insert-or-remove-trailing-char (&optional ch)
  (interactive)
  (let ((ch (or ch (read-char "Input char: ")))
        (fn (lambda (ch)
              (end-of-line)
              (if (eq (char-before) ch)
                  (delete-backward-char 1)
                (insert-char ch)))))
    (save-excursion
      (if (region-active-p)
          (save-restriction
            (narrow-to-region (region-beginning) (region-end))
            (deactivate-mark)
            (goto-char (point-min))
            (funcall fn ch)
            (while (< (point) (- (point-max) 1))
              (next-line)
              (funcall fn ch)))
        (funcall fn ch)))))

(defun insert-or-remove-trailing-semi ()
  (interactive)
  (insert-or-remove-trailing-char ?\;))

(defun insert-or-remove-trailing-comma ()
  (interactive)
  (insert-or-remove-trailing-char ?,))
1 个赞

再分享一个:

(defun ins-c++-curly ()
  "Insert {}.
Threat is as function body when from endline before )"
  (interactive)
  (if (looking-back "\\()\\|try\\|else\\|const\\|:\\)$")
      (progn
        (insert " {\n\n}")
        (indent-according-to-mode)
        (forward-line -1)
        (indent-according-to-mode))
    (insert "{}")
    (backward-char)))

(add-hook 'c-mode-common-hook 'my-c-common-hook)

(defun my-c-common-hook ()
  (define-key c-mode-base-map "{" 'ins-c++-curly))

这是我刚入坑的时候急切寻找的另一个function,输入大括号并换行并把光标放在中间(我绑了个<C-return>然后把if去掉了)。来源在这里:cc mode - New line and autoindent braces in ccmode in Emacs - Stack Overflow


题外话:

逗号的话,因为在行尾输入之后没有要跑回前面括号里这样的问题,我竟然一直没想到它可以和分号一样简化一下 :joy: 这次抛砖引玉我给自己打9.9分

编辑 json 或数组之类的数据就要用到逗号了。