LINUX.ORG.RU

помогите пересесть на emacs с vim'а


0

0

Часто есть необходимость редактировать отдельные C,C++,Java файлы и компилировать их (упражнения, задачки на онлайн конкурсы и т.п.). Городить Makefile для каждого такого файлика глупо. В vim я делал так и был счастлив:

map gcc<F9> :set makeprg=gcc\ -Wall\ %<CR>
map gccm<F9> :set makeprg=gcc\ -lm\ -Wall\ %<CR>
map g++<F9> :set makeprg=g++\ -Wall\ %<CR>
map <F9> :make<CR>
map <F8> :cc<CR>

То етсь
по gcc[F9] makeprg становилось gcc -Wall curr_buffer
по g++[F9] makeprg становилось g++ -Wall curr_buffer
по gccm[F9] --''-- gcc -lm -Wall curr_buffer
и так далее

[F9] компилировало
по [F8] мы прыгали к первой ошибке.

В emacs есть M-x compile на который я поставил хоткей и буфер Compilation чудесно решает прыганье по ошибкам.

Но как навесить на хоткеи 'gcc -Wall curr_buffer' и им подобные?

(require 'compile)
(add-hook 'c-mode-hook
(lambda ()
(unless (file-exists-p "Makefile")
(set (make-local-variable 'compile-command)
(let ((file (file-name-nondirectory buffer-file-name)))
(concat "gcc -O2 -Wall -o " (file-name-sans-extension file)
" " file))))))

aton
()
Ответ на: комментарий от myhand

Насчет automake:
Спасибо, я пешком постою. ;)

Насчет примера:
Спасибо! Правда это не то. Но близко.

dissident ★★
() автор топика
Ответ на: комментарий от aton

Сделал так.. Не лучшее что можно придумать но сойдет... Конечно круче
было бы компилировать по Esc Esc m всегда а только раз ставить тип 
компиляции. Ну да Б-г с ним.

;; compilation (when we compile we get the compilation window with errors
;; and by clicking or pressing enter on them we jump to error.. to 
;; switch between windows C-x o may be used. to kill a window C-x 0 may be used.
;; to leave only current window C-x 1 may be used. To create window C-x 2 or C-x 3
;; may be used

;;compilation window shall scroll down so we are able to see all errors on the fly
(setq compilation-scroll-output 1)

;; When pressing "Esc Esc a" we save buffer and compile with make -k
(global-set-key (kbd "\e\ea") 'user-save-and-make-all)
;; When pressing "Esc Esc c" we save buffer and compile it with gcc -Wall 
(global-set-key (kbd "\e\ec") 'user-save-and-compile-gcc)
;; When pressing "Esc Esc m" we save buffer and compile it with gcc -lm -Wall (for math.h)
(global-set-key (kbd "\e\em") 'user-save-and-compile-gcc-lm)
;; When pressing "Esc Esc p" we save buffer and compile it with g++ -lm -Wall
(global-set-key (kbd "\e\ep") 'user-save-and-compile-g++)
;; When pressing Esc Esc j we save buffer and compile it with java
(global-set-key (kbd "\e\ej") 'user-save-and-compile-java)
;; When pressing Esc-Esc k we kill the compilation process
(global-set-key (kbd "\e\ek") 'kill-compilation)

;;general compile function call "make all"
(defun user-save-and-make-all ()
	"save and call compile as make all"
	(interactive)
	(save-buffer)
	(compile "make all")
	(message "make all executed!"))

;; compiling with gcc function
(defun user-save-and-compile-gcc ()
  	"save and call compile as gcc -Wall"
	(interactive)
	(save-buffer)
	(compile (concat "gcc -Wall " (buffer-file-name)))
	(message "compilation executed!"))

;; compiling with gcc -lm function
(defun user-save-and-compile-gcc-math ()
  	"save and call compile as gcc -lm -Wall"
	(interactive)
	(save-buffer)
	(compile (concat "gcc -lm -Wall " (buffer-file-name)))
	(message "compilation executed!"))

;; compiling with g++ function
(defun user-save-and-compile-g++ ()
  	"save and call compile as g++ -Wall"
	(interactive)
	(save-buffer)
	(compile (concat "g++ -Wall " (buffer-file-name)))
	(message "compilation executed!"))

;; compiling with java function
(defun user-save-and-compile-java ()
  	"save and call compile as java"
	(interactive)
	(save-buffer)
	(compile (concat "java " (buffer-file-name)))
	(message "compilation executed!"))

dissident ★★
() автор топика

Я в таких случаях добавляю compile-command к списку локальных переменных.

Например так: (эта строка должна быть первой в файле)

/* -*- mode: c; compile-command: "gcc -Wall -g -lm lab1.c -o lab1" -*- */

Удобно, и не надо писать кучу эвристического кода, который бы угадывал, какая комманда компиляции мне сейчас нужна :)

nsav-ng
()
Ответ на: комментарий от nsav-ng

Кстати еще вопрос.. Хочется иметь dd как в vim. Сделал так:

;; we want to kill all line with C-k wherever the cursor is
(setq kill-whole-line t)

Почти хорошо но курсор надо перемещать в начало линии. Как сделать так чтобы C-k прибивал всю линию независимо от позиции курсора? Или может быть есть иная команда работающая как dd в vim?

dissident ★★
() автор топика
Ответ на: комментарий от dissident

> Или может быть есть иная команда работающая как dd в vim?

Значит так. Вместо того, чтоб искать команды, можно просто взять их и написть. Фтопку нотепадскую псхилогию. Ботай elisp.

(global-set-key (kbd "C-k") #'(lambda () (interactive) (beginning-of-line) (kill-line))))

nsav-ng
()

Твой путь нерационален. Кури здесь http://www.linux.org.ru/jump-message.jsp?msgid=1082670&lastmod=1127282488...

совет: изучи таки GNU make, чтобы потом не совершать бесполезных актов насилия над бедным текстовым редакотором. Если некуда сил девать "заведи девушку" и кромсай ее. Может демографическая ситуация улучшится ... впрочем кого я обманываю ... генофод то в любом случае ухудшится

GameMagister
()
Ответ на: комментарий от GameMagister

> Твой путь нерационален.
Путь воина. ;)

> совет: изучи таки GNU make, чтобы потом не совершать бесполезных
> актов насилия над бедным текстовым редакотором.
Какой же он текстовый редактор, он же по мнению многих единственно правильное IDE. Без автокомплита. ;)

> Если некуда сил девать "заведи девушку" и кромсай ее. Может
> демографическая ситуация улучшится ... впрочем кого я обманываю ...
> генофод то в любом случае ухудшится
Мне так удобно, что еще от жизни надо?

PS Всем спасибо за помощь!

dissident ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.