Estou trabalhando nessa pequena função que puxa a próxima linha para a linha atual. Desejo adicionar uma funcionalidade para que, se a linha atual for um comentário de linha e a próxima linha também for um comentário de linha, os caracteres do comentário sejam removidos após a ação "pull-up".
Exemplo:
Antes
;; comment 1▮
;; comment 2
Chamando M-x modi/pull-up-line
Depois de
;; comment 1▮comment 2
Observe que os ;;
caracteres foram removidos antes comment 2
.
(defun modi/pull-up-line ()
"Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.
If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
(interactive)
(join-line -1)
;; If the current line is a comment
(when (nth 4 (syntax-ppss))
;; Remove the comment prefix chars from the pulled-up line if present
(save-excursion
(forward-char)
(while (looking-at "/\\|;\\|#")
(delete-forward-char 1))
(when (looking-at "\\s-")
(delete-forward-char 1)))))
A função acima funciona, mas por agora, independentemente do major-mode, que irá considerar /
ou ;
ou #
como um caractere de comentário: (looking-at "/\\|;\\|#")
.
Eu gostaria de tornar essa linha mais inteligente; modo principal específico.
Solução
Graças à solução @ericstokes, acredito que o abaixo agora cobre todos os meus casos de uso :)
(defun modi/pull-up-line ()
"Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.
If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
(interactive)
(join-line -1)
;; If the current line is a comment
(when (nth 4 (syntax-ppss))
;; Remove the comment prefix chars from the pulled-up line if present
(save-excursion
(forward-char)
;; Delete all comment-start or space characters
(while (looking-at (concat "\\s<" ; comment-start char as per syntax table
"\\|" (substring comment-start 0 1) ; first char of `comment-start'
"\\|" "\\s-")) ; extra spaces
(delete-forward-char 1)))))
elisp
comment
syntax-table
Kaushal Modi
fonte
fonte
/* ... */
)?comment-start
ecomment-end
definidas como "/ *" e "* /" emc-mode
(mas nãoc++-mode
). E temc-comment-start-regexp
isso que combina com os dois estilos. Você exclui os caracteres finais e o início após a junção. Mas eu acho que a minha solução seriauncomment-region
,join-line
ocomment-region
e deixe Emacs preocupação sobre o caractere de comentário é o que.Respostas:
Você pode verificar se o caráter atual é um caractere de comentário utilizando a tabela de sintaxe:
(looking-at "\\s<")
. O regexp\\s<
corresponderá a qualquer caractere com a sintaxe "comment start";\\s>
corresponderá àqueles com a sintaxe "fim do comentário".Outra opção é a variável
comment-start
, que é a string inserida porcomment-dwim
e amigos. Geralmente, é definido como o caractere de início do comentário mais algum espaço.fonte
Existe um solução muito mais simples , por favor estude meu código em https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el
Não vou copiar / colar todo o código aqui. mas aqui estão os pontos principais:
comment tem sua própria fonte, procure font-lock-comment-face e font-lock-comment-delimiter-face no meu código
use a própria API do Emacs para descomentar a segunda linha e depois junte-a à primeira linha
Ele deve funcionar em quaisquer modos principais sensíveis.
Este truque não é inventado por mim. Na verdade, é do próprio código do Emacs (mais especificamente, flyspell). Portanto, a solução deve suportar todos os modos principais de flyspell
fonte
Se você está procurando esse recurso por código lisp (Elisp, Clojure, Scheme e Common Lisp), tente o lispy , uma função chamada
lispy-fill
faz esse tipo de coisa.Se você estiver procurando esse recurso por outro idioma, deverá rebox2 (verificado para
C
ePython
), uma função chamadarebox-fill
ou outra função chamadarebox-dwim
fazer esse tipo de coisa.Os dois são ótimos pacotes e não conflitam entre si, pois são usados para modos principais diferentes e estão ambos (
lispy-fill
erebox-dwim
) vinculados a elesM-q
, bem legais.fonte