Trước tiên, bạn sẽ cần phải học cách vận hành văn bản cơ bản với emacs. Vì emacs rất tinh vi tìm ra cách đơn giản để chọn văn bản và sao chép có thể là một thách thức. Vì vậy, hãy đầu tư một chút thời gian để tìm hiểu làm thế nào để làm điều đó một cách hiệu quả. Đọc hướng dẫn có thể giúp đỡ. Đối với Mac OS X sử dụng Aquamacs, nó hỗ trợ các phím tắt riêng.
Làm việc với ESS không khác với làm việc với R. Các quy tắc tương tự để tổ chức mã nên được áp dụng. Trong trường hợp của tôi, mỗi dự án đều có thư mục riêng, nằm trong thư mục mẹ có tên R, nằm trong thư mục chính của tôi (Đối với Windows, tôi khuyên bạn nên trỏ thư mục chính của emacs vào thư mục chứa tất cả nguồn của bạn). Vì vậy, khi tôi sử dụng ESS để làm việc với dự án, tôi luôn luôn làm M-x R
và chọn thư mục bắt đầu thư mục dự án của tôi.
Sau khi bắt đầu quá trình R, tôi thường chia emacs trong hai cửa sổ (thuật ngữ emacs). Sau đó, bên trái tôi có một mã nguồn, mà tôi gửi cho quá trình R ở bên phải. Các phím tắt có liên quan (đây là các phím tắt emacs) C-x 3
để chia dọc các cửa sổ, C-x 1
để làm cho bộ đệm hiện tại trở thành cửa sổ duy nhất và C-x 2
để chia các cửa sổ theo chiều ngang.
Khi gửi mã đến R, tôi giữ sự phân biệt giữa các hàm và các câu lệnh R. Tôi làm điều này bằng cách giữ tất cả các chức năng của tôi trong một tệp thường được gọi 10code.R
. Sau đó, tôi chỉ có thể tải tệp này bằng cách sử dụng tùy chọn tải tệp ESS (phím tắt C-c C-l
). Ưu điểm của phương pháp này là nó cung cấp tất cả các hàm và không tạo ra gì trong bộ đệm R. Nếu có lỗi trong mã của bạn thì ESS sẽ hiển thị một thông báo trong bộ thu nhỏ và bạn có thể điều tra nó bằng cách nhấn C-c
`.
Mã khác là các câu lệnh R, mà tôi cố gắng tự giải thích: tải dữ liệu, dữ liệu sạch, mô hình thống kê phù hợp, kiểm tra kết quả, đưa ra kết quả cuối cùng. Mã nguồn cho các báo cáo này là trạng thái hiện tại của dự án. Ý định là sau khi dự án kết thúc, tìm nguồn cung cấp các tệp với mã này, sao chép dự án (tôi cũng sử dụng git để theo dõi lịch sử). Khi làm việc với tệp này, tôi thường chỉ làm việc với một câu lệnh R mà tôi gửi cho quy trình R thông qua chức năng eval, đoạn văn, lệnh lệnh đó là phím tắt nào C-c C-c
. Lệnh này gửi đến R xử lý đoạn văn, tức là văn bản được phân định bởi các dòng mới. Điều này rất tiện lợi, vì bạn có thể nhóm các câu lệnh R thành các tác vụ và gửi toàn bộ tác vụ đến tiến trình R. Nó cũng không yêu cầu chọn văn bản, cũng rất thuận tiện. Phím tắtC-c C-c
có lợi thế là nó di chuyển con trỏ đến cửa sổ R, vì vậy bạn có thể kiểm tra ngay kết quả của câu lệnh R đã gửi.
Vì vậy, quy trình làm việc cơ bản của tôi đang di chuyển rất nhiều giữa các cửa sổ và bộ đệm. Để thuận tiện cho việc này, tôi sử dụng các phím tắt sau trong tệp .emacs của mình:
(define-key global-map [f1] 'Control-X-prefix)
(define-key global-map [f3] 'find-file)
(define-key global-map [f2] 'save-buffer)
(define-key global-map [f8] 'kill-buffer)
(define-key global-map [f5] 'switch-to-buffer)
(define-key global-map [f6] 'other-window)
(define-key global-map [f9] 'ess-load-file)
Tôi hiếm khi sử dụng f1
, nhưng tất cả những người khác rất thường xuyên. Các cài đặt ESS cụ thể khác mà tôi sử dụng là như sau:
(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)
Điều này nói với ESS để làm cho tab rộng 4 ký tự (mặc định là 2), đó là sở thích cá nhân của tôi và mở rộng số lượng lệnh đã ban hành mà ESS lưu dưới dạng lịch sử.
Để làm việc trực tiếp với quá trình R, tôi thấy các phím tắt sau rất hữu ích:
(add-hook 'inferior-ess-mode-hook
'(lambda nil
(define-key inferior-ess-mode-map [\C-up] 'comint-previous-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-down] 'comint-next-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-x \t] 'comint-dynamic-complete-filename)
)
)
Điều này nhớ lại câu lệnh R từ lịch sử câu lệnh R của bạn, nhưng nó cố gắng khớp nó với câu lệnh đã có trên dòng của bạn. Vì vậy, ví dụ gõ pl
vào quá trình R và nhấn \C-up
(đó là điều khiển và mũi tên lên) sẽ quay vòng qua tất cả các câu lệnh bắt đầu pl
, vì vậy sẽ nhớ lại ví dụ như tất cả các plot(...
lệnh.
Cài đặt cuối cùng tôi sử dụng với ESS là như sau:
(setq ess-ask-about-transfile t)
Bằng cách này, ESS luôn hỏi nơi lưu văn bản trong bộ đệm với quy trình R. Tôi thường đánh số các tệp này theo ngày, vì vậy tôi luôn có một cách khác để theo dõi chính xác những gì tôi đang làm. Nhắc nhở duy nhất của tùy chọn này là vì một số lý do, ESS đặt bộ đệm R thành chỉ đọc, sau khi tải R. Phím tắt để tạo bộ đệm có thể ghi là C-x C-q
.
Vì vậy, đây là những cài đặt của tôi mà tôi sử dụng để làm việc với ESS, tôi cảm thấy hài lòng với chúng và tôi không cảm thấy cần phải thêm bất cứ điều gì trong một vài năm. Khi giới thiệu ESS cho người dùng lần đầu, tôi thường đưa ra tổng quan này.
Tôi sẽ kết thúc bằng phím tắt cuối cùng mà theo tôi là phím tắt được sử dụng nhiều nhất khi làm việc với Emacs và đặc biệt là với ESS C-g
, đó là thoát lệnh trong bộ đệm mini. Trong suốt những năm tôi làm việc với Emacs và ESS, tôi vẫn cố gắng gọi ra một số lệnh Emacs mà tôi không muốn, C-g
rất hữu ích trong những tình huống này.