Ngày tháng từ bảng tính


7

Tôi có thể tính ngày như vậy:

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
#+TBLFM: $4=$2+$3;D

nhưng những gì tôi muốn làm là làm cho ngày đó xuất hiện dưới dạng một ngày chương trình nghị sự, đại loại như:

DEADLINE: $remote(mytbl,@1$4)

nhưng nó không hoạt động. Tôi không thể tìm thấy bất kỳ cú pháp nào, thậm chí là một macro, sẽ cho phép mọi thứ trừ một ngày theo nghĩa đen cho một mục chương trình nghị sự.

Có ý kiến ​​gì không?


Có một chức năng lớp phủ được sử dụng để làm cho dấu thời gian trông giống như một cái gì đó khác với những gì nó thực sự là. Có lẽ dễ dàng nhất là chỉ điều chỉnh chức năng đó và làm cho nó che phủ định dạng của riêng bạn - bên dưới lớp phủ sẽ là dấu thời gian tiêu chuẩn được sử dụng bởi nhiều chức năng trong suốt org-modevà theo tôi có thể dễ dàng thay đổi lưu ý trong chuỗi doc cho biến dấu thời gian khuyên không nên điều chỉnh với nó.
luật

org-time-stamp-formatslà một biến được định nghĩa trong org.el. Giá trị của nó là ("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")Biến này có thể gặp rủi ro nếu được sử dụng như một biến cục bộ tệp. Tài liệu: Các định dạng format-time-stringđược sử dụng cho tem thời gian. Không nên thay đổi hằng số này. Xem thêm, định dạng tem thời gian tùy chỉnh: orgmode.org/manual/Custom-time-format.html#Custom-time-format
luật

Tôi nghĩ rằng tôi đã không giải thích nó một cách chính xác. Tôi không cố gắng thay đổi giao diện của dấu thời gian. Tôi ổn với mẫu <% Y-% m-% d% a> bình thường. Những gì tôi muốn kết thúc là tương đương với "DEADLINE: <2015-01-13 Tue>" nhưng thay vì nhập nó vào bản thân tôi, tôi muốn nó đến từ bảng tính đã được tính toán. Có cách nào để vận chuyển thông tin đó? Hoặc có một cách khác để cung cấp một cái gì đó sau "DEADLINE:" (như có thể là elisp, nơi tôi có thể tính ngày), nơi nó sẽ được hiểu là một ngày?
jtgd

Tôi không có câu trả lời, nhưng muốn đưa ra một số ý tưởng. Nói chung, bộ đệm org-agenda chỉ là một bản sao đẹp và dán từ các tệp org-agenda thô. Trong một chủ đề gần đây, tôi cuộn qua các tệp org-agenda-backback và dừng lại ở tiêu đề của mỗi mục để xử lý dấu thời gian như thể đó là x số ngày AD để thực hiện một số tính toán tiếp theo (ví dụ: liệu có phải là do hôm nay, hoặc quá hạn). emacs.stackexchange.com/a/5700/2287 Về lý thuyết, bạn có thể dừng lại ở mỗi tiêu đề và thực hiện các tính toán của mình và tạo bộ đệm chương trình nghị sự tùy chỉnh. Điều này là không tầm thường, nhưng thú vị.
luật

Vâng cảm ơn vì danh sách luật phản hồi của bạn, tôi đoán rằng phải có một cách để có được một ngày vào chương trình nghị sự bên cạnh việc gõ một chuỗi chữ. Có lẽ tôi có thể đào sâu vào các chức năng được sử dụng khi chương trình nghị sự đang được tạo. Tôi ước có một cái gì đó giống như một chức năng 'eval' sẽ quét lại đầu ra của một chức năng.
jtgd

Câu trả lời:


4

Thử cái này:

Tính thời hạn trong một bảng tính aka bảng .

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
| # | [2014-12-15 Mon] | 10 | <2014-12-25 Thu> |
#+TBLFM: $4=$2+$3;D

Tạo bảng 1x1 mới tham chiếu thời hạn tính toán từ bảng đầu tiên bằng remote(NAME-OR-ID,REF)hàm.

#+NAME: mydeadline
| <2015-01-13 Tue> |
#+TBLFM: $1=remote(mytbl,@1$4)

Chuyển bảng thời hạn 1x1 dưới dạng biến qua tiêu đề :var name=value cho SRC khối được đặt tên , ví dụ: khối mã elisp set_deadline bên dưới.

#+NAME: set_deadline
#+HEADER: :var the_date=mydeadline
#+HEADER: :results  raw replace output 
#+begin_src elisp
   (princ (format "DEADLINE: %s" ( car (car the_date))))
#+end_src

Đánh giá khối SRC bằng cách sử dụng C-c C-cvà thời hạn sẽ được thêm vào tệp chế độ org dưới một #+RESULTS:khối.

Việc thêm :results raw tiêu đề vào khối mã sẽ buộc đầu ra thành định dạng chế độ org sẽ nhận ra đó là câu lệnh org thông thường.

#+RESULTS: set_deadline
DEADLINE: <2015-01-13 Tue>

Là một phần thưởng bổ sung, sử dụng các khối src có tên cũng khuyến khích tái sử dụng mã thông qua các lệnh gọi hàm nội tuyến.

Như trước, đánh giá từng chức năng nội tuyến bằng cách sử dụng C-c C-cvà thời hạn mới sẽ được thêm vào tệp chế độ tổ chức.

#+NAME: first-deadline
call_set_deadline(the_date=mydeadline)[ :results raw ]

#+RESULTS: first-deadline
DEADLINE: <2015-01-13 Tue>

#+NAME: my-other-deadline
| <2014-12-25 Thu> |
#+TBLFM: $1=remote(mytbl,@2$4)

#+NAME: second-deadline
call_set_deadline(the_date=my-other-deadline)[ :results raw ]

#+RESULTS: second-deadline
DEADLINE: <2014-12-25 Thu>

Hy vọng rằng đã giúp!

Lưu ý: Mã này đã được kiểm tra bằng các phiên bản sau của emacs và chế độ org.

GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)
Org-mode version 8.2.10 (8.2.10-29-g89a0ac-elpa)

@jtgd, câu trả lời này có giúp được không?
Melioratus

Vâng rất nhiều. Xem bên dưới.
jtgd

@jtgd Cảm ơn bạn! Bạn đã làm cho ngày của tôi! Liên quan đến việc replacekhông hành xử như mong đợi, hãy thử cập nhật rawtiêu đề với drawertiêu đề. Sau khi tôi chuyển đổi, mọi thứ hoạt động như mong đợi. Mong rằng đã được giúp đỡ! Cảm ơn đã hỏi câu hỏi của bạn và mã elisp của bạn!
Melioratus

@jtgd - Tôi vừa đăng một ví dụ khác sử dụng các khối mã nhỏ được viết bằng eLisp, Perl, bash, Python và Ruby để biến văn bản thành một danh sách các hộp kiểm.
Melioratus

Ồ, cảm ơn lần nữa! Điều drawernày hoạt động hoàn hảo bây giờ. Rất nhiều điều để tìm hiểu về chế độ org, thật tuyệt khi có các pháp sư như bạn xung quanh. Đối với các ví dụ được đăng khác của bạn, tôi đã thử một cái và nó hoạt động rawmà không cần nối thêm. Nhưng ứng dụng của tôi hoạt động nên tôi rất vui.
jtgd

1

Cảm ơn bạn rất nhiều Melioratus, thật là một câu trả lời xuất sắc! Thật đáng kinh ngạc khi bạn sử dụng các cơ chế khác nhau của chế độ Org để làm điều này. Phần quan trọng nhất của điều này đối với tôi là :results rawphần văn bản xuất ra để được giải cứu bởi việc tạo chương trình nghị sự. Đó là chìa khóa.

Khi tôi xem làm thế nào tôi có thể mở rộng điều này để xử lý nhiều ngày, tôi tự hỏi liệu tôi không thể thực hiện các phép tính ngày trong elisp. Tôi vẫn còn rất mới với elisp nhưng tôi đã hack một chút và nghĩ ra điều này.

Nhiệm vụ của tôi là tính ngày hết thuốc của tôi bằng cách thêm 30 ngày vào ngày tôi bắt đầu chai. Những gì tôi đã làm là điều này.

Trong .emacs của tôi, tôi đã viết một số chức năng:

(defun date-high-low (secs)
  "Split int into high-low words"
  (list (/ secs 65536) (% secs 65536)))

(defun date-plus-days (datestr days)
  "Generate org-style date string from date + days offset"
  (format-time-string "<%Y-%m-%d %a>" (date-high-low (truncate (+ (org-time-string-to-seconds datestr) (* days 86400))))))

(defun org-header-date-plus-days (fmt datestr days)
  "Use above to build final org header entry from format string"
  (princ (format fmt (date-plus-days datestr days))))

Tôi đã cố gắng để giữ cho các chức năng này chung chung và không tập trung vào meds cho tái sử dụng. Có thể có nhiều cách tốt hơn để làm điều này, như tôi đã nói tôi là người mới.

Sau đó, trong tệp .org của tôi, tôi làm điều này:

#+HEADER: :results raw output replace
#+begin_src elisp
    (org-header-date-plus-days "** MED LAST DAY Med-1\nDEADLINE: %s\n" "[2014-12-14 Sun]" 30)
    (org-header-date-plus-days "** MED LAST DAY Med-2\nDEADLINE: %s\n" "[2014-12-22 Mon]" 54)
    (org-header-date-plus-days "** MED LAST DAY Med-3\nDEADLINE: %s\n" "[2015-01-02 Fri]" 60)
#+end_src

Đẹp và gọn gàng, một dòng mỗi ví dụ. Làm Cc Cc trên khối sẽ tạo tiêu đề và DEADLINE theo ngày và nó hiển thị hoàn hảo trong chương trình nghị sự. Nó hoạt động tốt và tôi hài lòng với các lỗi. Cảm ơn một lần nữa cho lời khuyên cho bạn và danh sách pháp luật.

Điều duy nhất không hoạt động là replace. Nó luôn gắn vào khối # + KẾT QUẢ nên tôi phải xóa nó trước khi tạo. Đó là nhỏ nhưng tôi không hiểu tại sao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.